fa
Feedback
Golang | LeetCode

Golang | LeetCode

رفتن به کانال در Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

نمایش بیشتر
3 646
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-57 روز
-4730 روز

در حال بارگیری داده...

جذب مشترکین
ژوئیه '26
ژوئیه '26
+10
در 0 کانال‌ها
ژوئن '26
+22
در 0 کانال‌ها
Get PRO
مه '26
+13
در 0 کانال‌ها
Get PRO
آوریل '26
+21
در 0 کانال‌ها
Get PRO
مارس '26
+30
در 0 کانال‌ها
Get PRO
فوریه '26
+26
در 0 کانال‌ها
Get PRO
ژانویه '26
+31
در 0 کانال‌ها
Get PRO
دسامبر '25
+36
در 0 کانال‌ها
Get PRO
نوامبر '25
+123
در 1 کانال‌ها
Get PRO
اکتبر '25
+170
در 1 کانال‌ها
Get PRO
سپتامبر '25
+97
در 0 کانال‌ها
Get PRO
اوت '25
+156
در 0 کانال‌ها
Get PRO
ژوئیه '25
+162
در 1 کانال‌ها
Get PRO
ژوئن '25
+153
در 0 کانال‌ها
Get PRO
مه '25
+149
در 0 کانال‌ها
Get PRO
آوریل '25
+197
در 0 کانال‌ها
Get PRO
مارس '25
+320
در 2 کانال‌ها
Get PRO
فوریه '25
+194
در 0 کانال‌ها
Get PRO
ژانویه '25
+342
در 53 کانال‌ها
Get PRO
دسامبر '24
+166
در 0 کانال‌ها
Get PRO
نوامبر '24
+133
در 1 کانال‌ها
Get PRO
اکتبر '24
+273
در 13 کانال‌ها
Get PRO
سپتامبر '24
+809
در 329 کانال‌ها
Get PRO
اوت '24
+127
در 0 کانال‌ها
Get PRO
ژوئیه '24
+671
در 219 کانال‌ها
Get PRO
ژوئن '24
+756
در 232 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
10 ژوئیه0
09 ژوئیه+1
08 ژوئیه+3
07 ژوئیه+1
06 ژوئیه0
05 ژوئیه+1
04 ژوئیه+1
03 ژوئیه+1
02 ژوئیه+1
01 ژوئیه+1
پست‌های کانال
Задача: 1133. Largest Unique Number Сложность: easy Вам Дан целочисленный массив nums, верните наибольшее целое число, которое встречается только один раз. Если ни одно целое число не встречается один раз, верните -1. Пример:
Input: nums = [5,7,3,9,4,9,8,3,1]
Output: 8
Explanation: The maximum integer in the array is 9 but it is repeated. The number 8 occurs only once, so it is the answer.
👨‍💻 Алгоритм: 1⃣Создайте хеш-таблицу для хранения количества каждого числа в массиве. 2⃣Пройдите по массиву и заполните хеш-таблицу количеством каждого числа. 3⃣Инициализируйте результат значением -1. Пройдите по хеш-таблице и если значение ключа равно 1, установите результат равным максимальному значению между ключом и текущим результатом. Верните результат. 😎 Решение:
func largestUniqueNumber(nums []int) int {
    count := make(map[int]int)
    
    for _, num := range nums {
        count[num]++
    }
    
    result := -1
    for key, value := range count {
        if value == 1 {
            if key > result {
                result = key
            }
        }
    }
    
    return result
}
Ставь 👍 и забирай 📚 Базу знаний

2
Задача: 948. Bag of Tokens Сложность: medium Вы начинаете с начальной силой, равной power, начальным счетом 0 и мешком жетонов, представленным в виде целочисленного массива tokens, где каждый tokens[i] обозначает значение tokeni. Ваша цель - максимизировать общее количество очков, стратегически разыгрывая эти жетоны. За один ход вы можете разыграть неразыгранный жетон одним из двух способов (но не обоими для одного и того же жетона): лицом вверх: Если ваша текущая сила не меньше жетонов[i], вы можете сыграть токени, потеряв силу жетонов[i] и получив 1 очко. Лицом вниз: Если ваш текущий счет не меньше 1, вы можете сыграть токени, получив силу токенов[i] и потеряв 1 счет. Верните максимально возможный счет, который вы можете получить, сыграв любое количество токенов. Пример: Input: tokens = [100], power = 50 Output: 0 👨‍💻 Алгоритм: 1⃣Отсортировать массив tokens. Использовать два указателя: left и right, чтобы отслеживать начало и конец массива токенов. Инициализировать переменные для текущей силы power, текущего счета score и максимального счета maxScore 2⃣Повторять следующие шаги, пока left не превысит right: Если текущая сила power достаточна для разыгрывания токена tokens[left] лицом вверх, разыграть его и увеличить счет. Если текущая сила недостаточна, но счет больше 0, разыграть токен tokens[right] лицом вниз и уменьшить счет. Обновить максимальный счет, если текущий счет больше максимального. 3⃣Вернуть максимальный счет. 😎 Решение: package main import "sort" func bagOfTokensScore(tokens []int, power int) int { sort.Ints(tokens) left, right := 0, len(tokens) - 1 score, maxScore := 0, 0 for left <= right { if power >= tokens[left] { power -= tokens[left] score++ left++ if score > maxScore { maxScore = score } } else if score > 0 { power += tokens[right] score-- right-- } else { break } } return maxScore } Ставь 👍 и забирай 📚 Базу знаний
142
3
Задача: 242. Valid Anagram Сложность: easy Даны две строки s и t, верните true, если t является анаграммой s, и false в противном случае. Анаграмма — это слово или фраза, сформированная путём перестановки букв другого слова или фразы, обычно используя все исходные буквы ровно один раз. Пример: Input: s = "anagram", t = "nagaram" Output: true 👨‍💻 Алгоритм: 1⃣Создайте массив размером 26 для подсчета частот каждой буквы (поскольку s и t содержат только буквы от 'a' до 'z'). 2⃣Пройдитесь по строке s, увеличивая счетчик соответствующей буквы. Затем пройдитесь по строке t, уменьшая счетчик для каждой буквы. 3⃣Проверьте, не опустился ли счетчик ниже нуля во время обхода строки t. Если это произошло, значит в t есть лишняя буква, которой нет в s, и следует вернуть false. Если после проверки всех букв все счетчики равны нулю, возвращайте true, указывая на то, что t является анаграммой s. 😎 Решение: func isAnagram(s string, t string) bool { if len(s) != len(t) { return false } count := [26]int{} for i := range s { count[s[i]-'a']++ count[t[i]-'a']-- } for _, c := range count { if c != 0 { return false } } return true } Ставь 👍 и забирай 📚 Базу знаний
172
4
Задача: 644. Maximum Average Subarray II Сложность: hard Вам дан целочисленный массив nums, состоящий из n элементов, и целое число k. Найдите смежный подмассив, длина которого больше или равна k и который имеет максимальное среднее значение, и верните это значение. Принимается любой ответ с погрешностью вычислений менее 10-5. Пример: Input: nums = [1,12,-5,-6,50,3], k = 4 Output: 12.75000 👨‍💻 Алгоритм: 1⃣Используйте скользящее окно длины k для нахождения начального среднего значения. 2⃣Перемещайте окно по массиву, добавляя следующий элемент и убирая предыдущий, обновляя текущее среднее значение. 3⃣Следите за максимальным средним значением и верните его после проверки всех возможных окон. 😎 Решение: func findMaxAverage(nums []int, k int) float64 { n := len(nums) currSum := 0 for i := 0; i < k; i++ { currSum += nums[i] } maxSum := currSum for i := k; i < n; i++ { currSum += nums[i] - nums[i - k] if currSum > maxSum { maxSum = currSum } } return float64(maxSum) / float64(k) } Ставь 👍 и забирай 📚 Базу знаний
174
5
Задача: 1287. Element Appearing More Than 25% In Sorted Array Сложность: easy Дан массив целых чисел, отсортированный в неубывающем порядке. В этом массиве есть ровно одно число, которое встречается более чем в 25% случаев. Верните это число. Пример: Input: arr = [1,2,2,6,6,6,6,7,10] Output: 6 👨‍💻 Алгоритм: 1⃣Инициализируйте хеш-таблицу counts и перебирайте каждый элемент в массиве arr, увеличивая counts[num] для каждого элемента num. 2⃣Установите target = arr.length / 4. 3⃣Перебирайте каждую пару ключ-значение в counts и, если значение > target, верните ключ. Код никогда не достигнет этой точки, так как гарантируется, что ответ существует; верните любое значение. 😎 Решение: package main func findSpecialInteger(arr []int) int { counts := make(map[int]int) target := len(arr) / 4 for _, num := range arr { counts[num]++ if counts[num] > target { return num } } return -1 } Ставь 👍 и забирай 📚 Базу знаний
184
6
Задача: 893. Groups of Special-Equivalent Strings Сложность: medium Вам дан массив строк одинаковой длины words. За один ход вы можете поменять местами любые два четных или любые два нечетных символа строки words[i]. Две строки words[i] и words[j] являются специально-эквивалентными, если после любого количества ходов words[i] == words[j]. Например, words[i] = "zzxy" и words[j] = "xyzz" являются специально-эквивалентными, потому что мы можем делать ходы "zzxy" -> "xzzy" -> "xyzz". Группа специально-эквивалентных строк из слов - это непустое подмножество слов, такое, что: каждая пара строк в группе специально-эквивалентна, и группа имеет максимально возможный размер (т.е, не существует строки words[i], не входящей в группу, такой, что words[i] является специально-эквивалентной каждой строке в группе). Верните количество групп специально-эквивалентных строк из слов. Пример: Input: words = ["abcd","cdab","cbad","xyzz","zzxy","zzyx"] Output: 3 👨‍💻 Алгоритм: 1⃣Для каждой строки в массиве words создать два новых списка: один из символов на четных позициях, другой из символов на нечетных позициях. Отсортировать оба списка и объединить их в одну строку, которая будет представлять каноническую форму строки. 2⃣Использовать множество, чтобы хранить все уникальные канонические формы строк. 3⃣Размер множества будет равен количеству групп специально-эквивалентных строк. 😎 Решение: package main import ( "sort" "strings" ) func numSpecialEquivGroups(words []string) int { uniqueForms := make(map[string]struct{}) for _, word := range words { evenChars := []rune{} oddChars := []rune{} for i, c := range word { if i % 2 == 0 { evenChars = append(evenChars, c) } else { oddChars = append(oddChars, c) } } sort.Slice(evenChars, func(i, j int) bool { return evenChars[i] < evenChars[j] }) sort.Slice(oddChars, func(i, j int) bool { return oddChars[i] < oddChars[j] }) canonicalForm := string(evenChars) + string(oddChars) uniqueForms[canonicalForm] = struct{}{} } return len(uniqueForms) } Ставь 👍 и забирай 📚 Базу знаний
187
7
Хайлоад: производительность и планирование мощностей Приглашаем на практический курс для Middle/Senior-разработчиков, техлидо
Хайлоад: производительность и планирование мощностей Приглашаем на практический курс для Middle/Senior-разработчиков, техлидов, архитекторов, EM и CTO, которые хотят не просто “знать про хайлоад”, а руками разобраться, как работают производительность, нагрузочное тестирование и масштабирование. Будем выжимать 20–100K RPS из своих сервисов на своей инфраструктуре, строить latency/RPS-диаграммы, искать ограничения в стеке и использовать эти данные для capacity planning. В программе: Linux-инфраструктура, nginx, Prometheus/Grafana, нагрузочное тестирование через wrkx, тюнинг производительности, планирование мощностей. Вас жду живые онлайн-сессии и практические домашние задания, в ходе которых вы прокачаетесь в вопросах хайлоада, инфраструктуры и переосмыслите архитектурные подходы в более прагматичном, экономичном и инженерном ключе. 📌 Старт потока 13 июля. Кто мы: R&D-центр Devhands, основатель и автор курса Алексей Рыбак, ex-СТО Badoo и Yum! Brands, член программного комитета Highload. Изучайте программу и записывайтесь. Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzquZx6p5
184
8
Задача: 273. Integer to English Words Сложность: hard Преобразуйте неотрицательное целое число num в его словесное представление на английском языке. Пример: Input: num = 123 Output: "One Hundred Twenty Three" 👨‍💻 Алгоритм: 1⃣Обработка чисел до 20 и кратных 10 до 90: Создать массивы или словари для чисел от 1 до 19 и для кратных 10 от 20 до 90. Если число попадает в эти диапазоны, сразу вернуть соответствующее словесное представление. 2⃣Обработка сотен, тысяч, миллионов и миллиардов: Разделить число на группы по три цифры (единицы, тысячи, миллионы, миллиарды). Для каждой группы сформировать словесное представление с использованием рекурсивной функции для чисел от 1 до 999. 3⃣Формирование окончательного результата: Собрать словесное представление всех групп, добавив соответствующие суффиксы (тысячи, миллионы, миллиарды). Соединить все части в одну строку, удалив лишние пробелы. 😎 Решение: package main import ( "strings" "strconv" ) func numberToWords(num int) string { if num == 0 { return "Zero" } belowTwenty := []string{"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"} tens := []string{"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"} thousands := []string{"", "Thousand", "Million", "Billion"} var result string i := 0 for num > 0 { if num%1000 != 0 { result = helper(num%1000, belowTwenty, tens) + thousands[i] + " " + result } num /= 1000 i++ } return strings.TrimSpace(result) } func helper(num int, belowTwenty, tens []string) string { if num == 0 { return "" } else if num < 20 { return belowTwenty[num] + " " } else if num < 100 { return tens[num/10] + " " + helper(num%10, belowTwenty, tens) } else { return belowTwenty[num/100] + " Hundred " + helper(num%100, belowTwenty, tens) } } Ставь 👍 и забирай 📚 Базу знаний
178
9
Задача: 955. Delete Columns to Make Sorted II Сложность: easy Вам дан массив из n строк одинаковой длины. Мы можем выбрать любые индексы удаления и удалить все символы в этих индексах для каждой строки. Например, если у нас есть strs = ["abcdef", "uvwxyz"] и индексы удаления {0, 2, 3}, то конечный массив после удаления будет ["bef", "vyz"]. Предположим, что мы выбрали набор индексов удаления answer таким образом, что после удаления конечный массив имеет элементы в лексикографическом порядке (т.е, strs[0] <= strs[1] <= strs[2] <= ... <= strs[n - 1]). Возвращает минимально возможное значение answer.length. Пример: Input: strs = ["ca","bb","ac"] Output: 1 👨‍💻 Алгоритм: 1⃣Определить количество строк n и длину каждой строки m. Создать массив delete_count длиной m, который будет отслеживать количество удаляемых столбцов. 2⃣Итеративно проверить каждую пару соседних строк для всех столбцов. Если для данной пары строк обнаружено нарушение лексикографического порядка, отметить соответствующий столбец для удаления. 3⃣Повторять процесс до тех пор, пока массив строк не станет лексикографически отсортированным. Вернуть количество удаленных столбцов. 😎 Решение: package main func minDeletionSize(strs []string) int { n := len(strs) m := len(strs[0]) deleteCount := make([]bool, m) isSorted := func() bool { for i := 0; i < n-1; i++ { for j := 0; j < m; j++ { if deleteCount[j] { continue } if strs[i][j] > strs[i+1][j] { return false } if strs[i][j] < strs[i+1][j] { break } } } return true } for !isSorted() { for j := 0; j < m; j++ { if deleteCount[j] { continue } for i := 0; i < n-1; i++ { if strs[i][j] > strs[i+1][j] { deleteCount[j] = true break } } if deleteCount[j] { break } } } count := 0 for _, del := range deleteCount { if del { count++ } } return count } Ставь 👍 и забирай 📚 Базу знаний
169
10
Задача: 1663. Smallest String With A Given Numeric Value Сложность: medium Числовое значение строчной буквы определяется ее позицией (начиная с 1) в алфавите, поэтому числовое значение a равно 1, числовое значение b равно 2, числовое значение c равно 3 и так далее. Числовое значение строки, состоящей из строчных букв, определяется как сумма числовых значений ее символов. Например, числовое значение строки "abe" равно 1 + 2 + 5 = 8. Вам даны два целых числа n и k. Верните лексикографически наименьшую строку длиной n с числовым значением, равным k. Обратите внимание, что строка x лексикографически меньше строки y, если x идет перед y в словарном порядке, то есть либо x является префиксом y, либо, если i - первая позиция, где x[i] != y[i], то x[i] идет перед y[i] в алфавитном порядке. Пример: Input: n = 3, k = 27 Output: "aay" Explanation: The numeric value of the string is 1 + 1 + 25 = 27, and it is the smallest string with such a value and length equal to 3. 👨‍💻 Алгоритм: 1⃣Построить строку или массив символов result для хранения выбранных символов для каждой позиции. 2⃣Итерация от позиции 1 до n и заполнение символом каждой позиции: Найти позиции, которые нужно заполнить, исключая текущую позицию, задаваемую переменной positionsLeft как n - position - 1. Если значение k больше, чем positionsLeft * 26, зарезервировать числовое значение 26 (символ z) для всех оставшихся позиций positionsLeft. Вычислить значение текущей позиции, заданное переменной add, как k - (positionsLeft * 26). Вычесть рассчитанное значение add из k, чтобы найти оставшееся значение k после заполнения текущей позиции. Иначе, заполнить текущую позицию символом a, имеющим числовое значение 1. Вычесть 1 из k, чтобы найти оставшееся значение k после заполнения текущей позиции. 3⃣Повторять процесс, пока все позиции не будут заполнены. 😎 Решение: func getSmallestString(n int, k int) string {     result := make([]byte, n)     for i := 0; i < n; i++ {         result[i] = 'a'     }         for position := 0; position < n; position++ {         positionsLeft := (n - position - 1)         if k > positionsLeft * 26 {             add := k - (positionsLeft * 26)             result[position] = byte('a' + add - 1)             k -= add         } else {             k -= 1         }     }         return string(result) } Ставь 👍 и забирай 📚 Базу знаний
200
11
Задача: 1089. Duplicate Zeros Сложность: easy Дан массив целых чисел фиксированной длины arr, дублируйте каждое вхождение нуля, сдвигая оставшиеся элементы вправо. Учтите, что элементы за пределами длины исходного массива не записываются. Внесите указанные изменения в массив на месте и ничего не возвращайте. Пример: Input: arr = [1,0,2,3,0,4,5,0] Output: [1,0,0,2,3,0,0,4] Explanation: After calling your function, the input array is modified to: [1,0,0,2,3,0,0,4] 👨‍💻 Алгоритм: 1⃣Найдите количество нулей, которые будут продублированы, назовем это possible_dups. Необходимо убедиться, что мы не считаем нули, которые будут отброшены, так как отброшенные нули не будут частью итогового массива. Количество possible_dups даст нам количество элементов, которые будут отброшены из исходного массива. В любой момент времени length_ - possible_dups — это количество элементов, которые будут включены в итоговый массив. 2⃣Обработайте крайний случай для нуля, находящегося на границе оставшихся элементов. Будьте особенно внимательны при дублировании нулей в оставшемся массиве. Следует учитывать, лежит ли ноль на границе. Этот ноль может быть учтен с возможными дубликатами или может быть просто включен в оставшиеся элементы, когда не осталось места для его дубликата. Если он является частью possible_dups, мы хотим его дублировать, в противном случае — нет. 3⃣Итерируйте массив с конца и копируйте ненулевой элемент один раз, а нулевой элемент дважды. Когда мы говорим об отбрасывании лишних элементов, это означает, что мы начинаем с левой стороны лишних элементов и начинаем перезаписывать их новыми значениями, в конечном итоге сдвигая оставшиеся элементы вправо и создавая пространство для всех дублированных элементов в массиве. 😎 Решение func duplicateZeros(arr []int) { possibleDups := 0 length_ := len(arr) - 1 for left := 0; left <= length_ - possibleDups; left++ { if arr[left] == 0 { if left == length_ - possibleDups { arr[length_] = 0 length_-- break } possibleDups++ } } last := length_ - possibleDups for i := last; i >= 0; i-- { if arr[i] == 0 { arr[i + possibleDups] = 0 possibleDups-- arr[i + possibleDups] = 0 } else { arr[i + possibleDups] = arr[i] } } } Ставь 👍 и забирай 📚 Базу знаний
210
12
Задача: 1480. Running Sum of 1d Array Сложность: easy Дан массив nums. Мы определяем текущую сумму массива как runningSum[i] = сумма(nums[0]…nums[i]). Верните массив текущих сумм для nums. Пример: Input: nums = [1,2,3,4] Output: [1,3,6,10] Explanation: Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4]. 👨‍💻 Алгоритм: 1⃣Инициализация: Определите массив result. Инициализируйте первый элемент массива result первым элементом входного массива nums. 2⃣Вычисление текущих сумм: На индексе i добавьте сумму элемента nums[i] и предыдущей текущей суммы result[i - 1] в массив result. 3⃣Повторение для всех индексов: Повторите шаг 2 для всех индексов от 1 до n-1. 😎 Решение: func runningSum(nums []int) []int {     result := make([]int, len(nums))     result[0] = nums[0]     for i := 1; i < len(nums); i++ {         result[i] = result[i-1] + nums[i]     }     return result } Ставь 👍 и забирай 📚 Базу знаний
222
13
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» стал главным каналом для т
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» стал главным каналом для тех, кто использует нейросети на уровне разработки, автоматизации и опенсорса, а не просто балуется в чатах. Здесь собирают только то, что реально экономит человеко-часы и работает в проде. 🎓 Готовые ИИ-сервисы, промпты и ИИ-агенты для автоматизации рутины 📚 Разборы полезных ИИ-инструментов, локальных LLM и опенсорс-репозиториев 🛠 Практические кейсы, гайды по деплою моделей и интеграции ИИ в пайплайны ⚡️ Технические ИТ-новости без маркетинговой воды и душных отчетов Обучение и прокачка в реальном времени: работа с API (Claude, GPT), локалки (Ollama, vLLM), автоматизация кода, опенсорс-утилиты, AI-агенты и др. Ценишь время и работаешь с ИИ, подпишись: @clucai
176
14
Задача: 1318. Minimum Flips to Make a OR b Equal to c Сложность: medium Даны три положительных числа a, b и c. Верните минимальное количество переворотов, необходимых в некоторых битах a и b, чтобы сделать (a OR b == c) (побитовая операция OR). Операция переворота состоит из изменения любого отдельного бита с 1 на 0 или с 0 на 1 в их двоичном представлении. Пример: Input: a = 2, b = 6, c = 5 Output: 3 Explanation: After flips a = 1 , b = 4 , c = 5 such that (a OR b == c) 👨‍💻 Алгоритм: 1⃣Инициализируйте переменную answer как 0, которая будет использоваться для отслеживания минимального количества необходимых переворотов. 2⃣Итеративно обрабатывайте каждый бит двоичного представления чисел a, b и c одновременно: Если (c & 1) == 0, обновите answer как answer += (a & 1) + (b & 1). Если (c & 1) == 1, и если оба значения a & 1 и b & 1 равны 0, увеличьте answer на 1. 3⃣Сдвигайте все числа вправо с помощью a >>= 1, b >>= 1, c >>= 1. Если все числа равны 0, верните answer, в противном случае, повторите шаги 2 и 3. 😎 Решение func minFlips(a int, b int, c int) int { answer := 0 for a != 0 || b != 0 || c != 0 { if (c & 1) == 1 { if (a & 1) == 0 && (b & 1) == 0 { answer++ } } else { answer += (a & 1) + (b & 1) } a >>= 1 b >>= 1 c >>= 1 } return answer } Ставь 👍 и забирай 📚 Базу знаний
229
15
🔍 ТОП-5 ошибок на алгоритмической сессии Привет, на связи Таня Коровкина из ШОРТКАТ. Ментор по алгоритмам и backend-разработ
🔍 ТОП-5 ошибок на алгоритмической сессии Привет, на связи Таня Коровкина из ШОРТКАТ. Ментор по алгоритмам и backend-разработчик Каждый месяц тысячи разработчиков совершают одни и те же ошибки на алгоритмических интервью 🚩 И продолжают готовиться... не к тому. 6 июля(понедельник) в 19:00 (МСК) проведу вебинар и покажу, что на самом деле оценивает интервьюер и какие ошибки чаще всего приводят к отказу • дам практические советы, которые можно использовать уже на следующем собеседовании • расскажу про специфику российского BigTech 🤘 Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_go_bot Реклама. О рекламодателе.
181
16
Задача: 1344. Angle Between Hands of a Clock Сложность: medium Даны два числа, hour и minutes. Вернуть меньший угол (в градусах), образованный часовой и минутной стрелками. Ответы с точностью до 10^-5 от фактического значения будут считаться правильными. Пример: Input: hour = 12, minutes = 30 Output: 165 👨‍💻 Алгоритм: 1⃣Рассчитать углы: minutes_angle = 6 * minutes и hour_angle = (hour % 12 + minutes / 60) * 30. 2⃣Найти разницу: diff = abs(hour_angle - minutes_angle). 3⃣Вернуть меньший угол: min(diff, 360 - diff). 😎 Решение: package main import ( "math" ) func angleClock(hour int, minutes int) float64 { oneMinAngle := 6.0 oneHourAngle := 30.0 minutesAngle := oneMinAngle * float64(minutes) hourAngle := (float64(hour%12) + float64(minutes)/60.0) * oneHourAngle diff := math.Abs(hourAngle - minutesAngle) return math.Min(diff, 360 - diff) } Ставь 👍 и забирай 📚 Базу знаний
228
17
Задача: 1245. Tree Diameter Сложность: medium Диаметр дерева - это количество ребер в самом длинном пути в этом дереве. Имеется неориентированное дерево из n узлов, помеченных от 0 до n - 1. Вам дан двумерный массив edges, где edges.length == n - 1 и edges[i] = [ai, bi] означает, что между узлами ai и bi в дереве есть неориентированное ребро. Верните диаметр дерева. Пример: Input: edges = [[0,1],[0,2]] Output: 2 👨‍💻 Алгоритм: 1⃣Построение графа: Используем представление графа в виде списка смежности. 2⃣Поиск самой удаленной вершины (DFS1): Запускаем DFS от произвольной вершины (например, 0) для нахождения самой удаленной вершины от нее. 3⃣Поиск диаметра (DFS2): Запускаем DFS от найденной на предыдущем шаге самой удаленной вершины и находим самую удаленную вершину от нее. Это расстояние и будет диаметром дерева.reset(playerId): Устанавливаем счет игрока в 0. 😎 Решение: package main func treeDiameter(edges [][]int) int {     if len(edges) == 0 {         return 0     }     graph := make(map[int][]int)     for _, edge := range edges {         graph[edge[0]] = append(graph[edge[0]], edge[1])         graph[edge[1]] = append(graph[edge[1]], edge[0])     }     var farthestNode int     var dfs func(int, int) int     dfs = func(node int, parent int) int {         maxDepth := 0         for _, neighbor := range graph[node] {             if neighbor != parent {                 depth := dfs(neighbor, node)                 if depth+1 > maxDepth {                     maxDepth = depth + 1                     farthestNode = neighbor                 }             }         }         return maxDepth     }     dfs(0, -1)     startNode := farthestNode     dfs(startNode, -1)     return dfs(farthestNode, -1) } func main() {} Ставь 👍 и забирай 📚 Базу знаний
246
18
Задача: 1200. Minimum Absolute Difference Сложность: easy Дан массив различных целых чисел arr, найдите все пары элементов с минимальной абсолютной разницей между любыми двумя элементами. Верните список пар в порядке возрастания (по отношению к парам), каждая пара [a, b] следует условиям: a, b из arr a < b b - a равна минимальной абсолютной разнице между любыми двумя элементами в arr Пример: Input: arr = [4,2,1,3] Output: [[1,2],[2,3],[3,4]] Explanation: The minimum absolute difference is 1. List all pairs with difference equal to 1 in ascending order. 👨‍💻 Алгоритм: 1⃣Инициализация вспомогательного массива: Найдите минимальный элемент minElement и максимальный элемент maxElement в массиве arr. Инициализируйте вспомогательный массив line размером maxElement - minElement + 1 и установите смещение shift равным -minElement. Пройдите по массиву arr и для каждого элемента value увеличьте значение в индексе value + shift на 1. 2⃣Поиск минимальной абсолютной разницы: Пройдите по вспомогательному массиву line, начиная с индекса, соответствующего минимальному элементу. Проверьте значения на каждом индексе curr: - если line[curr] равно 0, пропустите этот индекс. - если line[curr] равно 1, сравните абсолютную разницу текущей пары currPairDiff с минимальной найденной разницей minPairDiff. - если currPairDiff больше minPairDiff, продолжайте. - если currPairDiff равно minPairDiff, добавьте эту пару в список ответов. - если currPairDiff меньше minPairDiff, очистите список ответов, добавьте эту пару и обновите minPairDiff. 3⃣Возврат результата: После прохождения всех элементов массива line, список ответов будет содержать все пары с минимальной абсолютной разницей. Верните список ответов. 😎 Решение: import ( "sort" ) func minimumAbsDifference(arr []int) [][]int { sort.Ints(arr) minDiff := int(^uint(0) >> 1) // Max int result := [][]int{} for i := 1; i < len(arr); i++ { diff := arr[i] - arr[i-1] if diff < minDiff { minDiff = diff result = [][]int{{arr[i-1], arr[i]}} } else if diff == minDiff { result = append(result, []int{arr[i-1], arr[i]}) } } return result } Ставь 👍 и забирай 📚 Базу знаний
249
19
Задача: 1424. Diagonal Traverse II Сложность: medium Дан двумерный целочисленный массив nums, верните все элементы nums в диагональном порядке. Пример: Input: nums = [[1,2,3,4,5],[6,7],[8],[9,10,11],[12,13,14,15,16]] Output: [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16] 👨‍💻 Алгоритм: 1⃣Инициализируйте очередь с (0, 0) и список ответов ans. 2⃣Пока очередь не пуста: Извлеките (row, col) из очереди. Добавьте nums[row][col] в ans. Если col == 0 и row + 1 в пределах массива, добавьте (row + 1, col) в очередь. Если col + 1 в пределах текущей строки, добавьте (row, col + 1) в очередь. 3⃣Верните ans. 😎 Решение: func findDiagonalOrder(nums [][]int) []int { queue := []struct{ row, col int }{{0, 0}} ans := []int{} for len(queue) > 0 { row, col := queue[0].row, queue[0].col queue = queue[1:] ans = append(ans, nums[row][col]) if col == 0 && row + 1 < len(nums) { queue = append(queue, struct{ row, col int }{row + 1, col}) } if col + 1 < len(nums[row]) { queue = append(queue, struct{ row, col int }{row, col + 1}) } } return ans } Ставь 👍 и забирай 📚 Базу знаний
240
20
Задача: 1531. String Compression II Сложность: hard Дана строка s и целое число k. Необходимо удалить не более k символов из s так, чтобы длина сжатой версии строки s с использованием RLE была минимальной. Найдите минимальную длину сжатой версии строки s после удаления не более k символов. Пример: Input: s = "aaabcccd", k = 2 Output: 4 Explanation: Compressing s without deleting anything will give us "a3bc3d" of length 6. Deleting any of the characters 'a' or 'c' would at most decrease the length of the compressed string to 5, for instance delete 2 'a' then we will have s = "abcccd" which compressed is abc3d. Therefore, the optimal way is to delete 'b' and 'd', then the compressed version of s will be "a3c3" of length 4. 👨‍💻 Алгоритм: 1⃣Обходим символы строки слева направо, решая для каждого символа, включать его в сжатую строку или нет. Это создает состояния (строка, оставшиеся для включения символы), которые можно представить в виде бинарного дерева, где левые потомки означают включение символов, а правые — их пропуск. Многочисленные повторяющиеся подзадачи указывают на необходимость использования динамического программирования. 2⃣Для определения состояния DP используем следующие параметры: количество пройденных символов (чтобы знать, какой символ обрабатывать следующим), последний добавленный символ в сжатую строку (чтобы определить изменение сжатия при добавлении нового символа), количество последнего символа (для правильного изменения длины сжатия при добавлении символа) и количество оставшихся символов, которые можно удалить. 3⃣Связываем состояния друг с другом: удаление нового символа увеличивает i на один и уменьшает k на один; включение нового символа оставляет длину сжатия неизменной (кроме случаев, когда частота последнего символа 1, 9 или 99) или увеличивает длину на один, если новый символ не равен последнему символу сжатия. 😎 Решение package main import "math" type Solution struct {     memo map[int]int     add  map[int]struct{} } func Constructor() Solution {     return Solution{memo: make(map[int]int), add: map[int]struct{}{1: {}, 9: {}, 99: {}}} } func (this *Solution) GetLengthOfOptimalCompression(s string, k int) int {     return this.dp(s, 0, byte('a'+26), 0, k) } func (this *Solution) dp(s string, idx int, lastChar byte, lastCharCount int, k int) int {     if k < 0 {         return math.MaxInt32 / 2     }     if idx == len(s) {         return 0     }     key := idx*101*27*101 + int(lastChar-'a')*101*101 + lastCharCount*101 + k     if res, found := this.memo[key]; found {         return res     }     deleteChar := this.dp(s, idx+1, lastChar, lastCharCount, k-1)     var keepChar int     if s[idx] == lastChar {         keepChar = this.dp(s, idx+1, lastChar, lastCharCount+1, k)         if _, found := this.add[lastCharCount]; found {             keepChar++         }     } else {         keepChar = this.dp(s, idx+1, s[idx], 1, k) + 1     }     res := min(deleteChar, keepChar)     this.memo[key] = res     return res } func min(a, b int) int {     if a < b {         return a     }     return b } Ставь 👍 и забирай 📚 Базу знаний
227