fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید

Golang | LeetCode

Golang | LeetCode

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

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

نمایش بیشتر
3 543
مشترکین
-424 ساعت
-137 روز
-5630 روز
جذب مشترکین
اکتبر '26
اکتبر '26
+11
در 0 کانال‌ها
سپتامبر '26
+19
در 0 کانال‌ها
Get PRO
اوت '26
+22
در 0 کانال‌ها
Get PRO
ژوئیه '26
+49
در 0 کانال‌ها
Get PRO
ژوئن '26
+22
در 1 کانال‌ها
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 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
26 اکتبر+1
25 اکتبر0
24 اکتبر+1
23 اکتبر0
22 اکتبر+1
21 اکتبر+1
20 اکتبر+1
19 اکتبر0
18 اکتبر+1
17 اکتبر+2
16 اکتبر0
15 اکتبر0
14 اکتبر0
13 اکتبر0
12 اکتبر0
11 اکتبر0
10 اکتبر0
09 اکتبر+2
08 اکتبر0
07 اکتبر0
06 اکتبر0
05 اکتبر+1
04 اکتبر0
03 اکتبر0
02 اکتبر0
01 اکتبر0
پست‌های کانال
Задача: 139. Word Break Сложность: medium Дана строка s и словарь строк wordDict. Верните true, если строку s можно разделить на последовательность одного или нескольких слов из словаря, разделённых пробелами. Обратите внимание, что одно и то же слово из словаря может использоваться несколько раз при разделении. Пример:
Input: s = "leetcode", wordDict = ["leet","code"]
Output: true
Explanation: Return true because "leetcode" can be segmented as "leet code".
👨‍💻 Алгоритм: 1⃣Инициализация структур данных: Преобразуйте wordDict в множество words для быстрой проверки вхождения. Инициализируйте очередь queue начальным значением 0 (индекс начала строки) и множество seen для отслеживания посещённых индексов. 2⃣Обход в ширину (BFS): Пока очередь не пуста, извлекайте первый элемент из очереди, обозначающий начальную позицию start. Если start равен длине строки s, возвращайте true, так как достигнут конец строки, и строку можно разделить на слова из словаря. Итерируйте end от start + 1 до s.length включительно. Для каждого end, проверьте, посещён ли он уже. 3⃣Проверка подстроки и обновление структур: Проверьте подстроку начиная с start и заканчивая перед end. Если подстрока находится в множестве words, добавьте end в очередь и отметьте его в seen как посещённый. Если BFS завершается и конечный узел не достигнут, возвращайте false. 😎 Решение:
func wordBreak(s string, wordDict []string) bool {
    words := make(map[string]bool)
    queue := make([]int, 0)
    seen := make([]bool, len(s)+1)
    for _, word := range wordDict {
        words[word] = true
    }
    queue = append(queue, 0)
    for len(queue) > 0 {
        start := queue[0]
        queue = queue[1:]
        if start == len(s) {
            return true
        }
        for end := start + 1; end <= len(s); end++ {
            if seen[end] {
                continue
            }
            if _, ok := words[s[start:end]]; ok {
                queue = append(queue, end)
                seen[end] = true
            }
        }
    }
    return false
}
Ставь 👍 и забирай 📚 Базу знаний

2
Задача: 1120. Maximum Average Subtree Сложность: medium Дан корень бинарного дерева. Верните максимальное среднее значение поддерева этого дерева. Ответы, отличающиеся от фактического ответа не более чем на 10^-5, будут приняты. Поддерево дерева — это любой узел этого дерева плюс все его потомки. Среднее значение дерева — это сумма его значений, деленная на количество узлов. Пример: Input: root = [5,6,1] Output: 6.00000 Explanation: For the node with value = 5 we have an average of (5 + 6 + 1) / 3 = 4. For the node with value = 6 we have an average of 6 / 1 = 6. For the node with value = 1 we have an average of 1 / 1 = 1. So the answer is 6 which is the maximum. 👨‍💻 Алгоритм: 1⃣Инициализация и определение State: Определите класс State для хранения количества узлов в поддереве, суммы значений узлов в поддереве и максимального среднего значения поддерева. 2⃣Постобход (postorder traversal): Реализуйте функцию maxAverage, которая выполняет постобход дерева, вычисляя nodeCount, valueSum и maxAverage для каждого узла, начиная с дочерних узлов и продвигаясь к родительским узлам. 3⃣Вычисление максимального среднего значения: Используйте значения, полученные от дочерних узлов, для вычисления среднего значения для текущего узла и обновите maxAverage, если новое среднее значение больше текущего максимума. 😎 Решение: package main import "math" type TreeNode struct { Val int Left *TreeNode Right *TreeNode } type State struct { nodeCount int valueSum int maxAverage float64 } func maximumAverageSubtree(root *TreeNode) float64 { return maxAverage(root).maxAverage } func maxAverage(node *TreeNode) State { if node == nil { return State{0, 0, 0} } left := maxAverage(node.Left) right := maxAverage(node.Right) nodeCount := left.nodeCount + right.nodeCount + 1 valueSum := left.valueSum + right.valueSum + node.Val currentAverage := float64(valueSum) / float64(nodeCount) maxAverage := math.Max(currentAverage, math.Max(left.maxAverage, right.maxAverage)) return State{nodeCount, valueSum, maxAverage} } Ставь 👍 и забирай 📚 Базу знаний
113
3
Задача: 1461. Check If a String Contains All Binary Codes of Size K Сложность: medium Дана бинарная строка s и целое число k, верните true, если каждый бинарный код длины k является подстрокой s. В противном случае верните false. Пример: Input: s = "00110110", k = 2 Output: true Explanation: The binary codes of length 2 are "00", "01", "10" and "11". They can be all found as substrings at indices 0, 1, 3 and 2 respectively. 👨‍💻 Алгоритм: 1⃣Определите количество возможных двоичных кодов длины k. 2⃣Создайте массив для отслеживания, какие коды были найдены. Итерируйте по строке s, вычисляя хэш для текущего окна длины k и обновляя массив отслеживания. 3⃣Возвращайте true, если все возможные коды найдены, иначе false. 😎 Решение: func hasAllCodes(s string, k int) bool { need := 1 << k got := make([]bool, need) allOne := need - 1 hashVal := 0 for i := 0; i < len(s); i++ { hashVal = ((hashVal << 1) & allOne) | int(s[i]-'0') if i >= k-1 && !got[hashVal] { got[hashVal] = true need-- if need == 0 { return true } } } return false } Ставь 👍 и забирай 📚 Базу знаний
148
4
Задача: 1042. Flower Planting With No Adjacent Сложность: medium У вас есть n садов, помеченных от 1 до n, и массив paths, где paths[i] = [xi, yi] описывает двунаправленный путь между садом xi и садом yi. В каждом саду вы хотите посадить один из 4 типов цветов. Все сады имеют не более 3 путей, входящих и выходящих из него. Ваша задача - выбрать тип цветка для каждого сада так, чтобы для любых двух садов, соединенных путем, они имели разные типы цветов. Верните любой такой выбор в виде массива answer, где answer[i] - тип цветка, посаженного в (i+1)-м саду. Типы цветов обозначаются 1, 2, 3 или 4. Ответ гарантированно существует. Пример: Input: n = 3, paths = [[1,2],[2,3],[3,1]] Output: [1,2,3] 👨‍💻 Алгоритм: 1⃣Построение графа: Создайте граф из садов и путей между ними. 2⃣Присваивание цветов: Для каждого сада выберите тип цветка, который не используется соседними садами. 3⃣Мы будем проходить по каждому саду и выбирать тип цветка, который не совпадает с типами цветов в соседних садах. Поскольку у каждого сада не более трех соседей, всегда будет возможность выбрать тип цветка из 4 возможных типов. 😎 Решение: func gardenNoAdj(n int, paths [][]int) []int { graph := make([][]int, n) for _, path := range paths { graph[path[0]-1] = append(graph[path[0]-1], path[1]-1) graph[path[1]-1] = append(graph[path[1]-1], path[0]-1) } answer := make([]int, n) for garden := 0; garden < n; garden++ { used := [5]bool{} for _, neighbor := range graph[garden] { used[answer[neighbor]] = true } for flower := 1; flower <= 4; flower++ { if !used[flower] { answer[garden] = flower break } } } return answer } Ставь 👍 и забирай 📚 Базу знаний
142
5
Задача: 1032. Stream of Characters Сложность: hard Разработайте алгоритм, который принимает поток символов и проверяет, является ли суффикс этих символов строкой заданного массива строк words. Например, если words = ["abc", "xyz"] и в поток добавлены четыре символа (один за другим) 'a', 'x', 'y' и 'z', ваш алгоритм должен определить, что суффикс "xyz" символов "axyz" соответствует "xyz" из words. Реализуйте класс StreamChecker: StreamChecker(String[] words) Инициализирует объект с массивом строк words. boolean query(char letter) Принимает новый символ из потока и возвращает true, если любой непустой суффикс из потока образует слово, которое есть в words. Пример: Input ["StreamChecker", "query", "query", "query", "query", "query", "query", "query", "query", "query", "query", "query", "query"] [[["cd", "f", "kl"]], ["a"], ["b"], ["c"], ["d"], ["e"], ["f"], ["g"], ["h"], ["i"], ["j"], ["k"], ["l"]] Output [null, false, false, false, true, false, true, false, false, false, false, false, true] 👨‍💻 Алгоритм: 1⃣Построение суффиксного Trie: Создайте суффиксный Trie (префиксное дерево) для хранения всех слов из массива words в обратном порядке. Это позволяет эффективно искать слова, которые являются суффиксами потока символов. 2⃣Проверка суффиксов: Для каждого нового символа, проходите по текущему списку символов и проверяйте, образуют ли они какой-либо суффикс, присутствующий в Trie. Если найдено совпадение, возвращайте true, иначе продолжайте добавлять новые символы и проверять суффиксы. 3⃣Сравнение двух случаев: Рассмотрите оба случая: подмассив длины firstLen до подмассива длины secondLen и подмассив длины secondLen до подмассива длины firstLen. Найдите максимальную сумму для каждого случая. 😎 Решение: type TrieNode struct { children map[byte]*TrieNode isEndOfWord bool } type StreamChecker struct { root *TrieNode stream []byte } func Constructor(words []string) StreamChecker { root := &TrieNode{children: make(map[byte]*TrieNode)} for _, word := range words { node := root for i := len(word) - 1; i >= 0; i-- { if node.children[word[i]] == nil { node.children[word[i]] = &TrieNode{children: make(map[byte]*TrieNode)} } node = node.children[word[i]] } node.isEndOfWord = true } return StreamChecker{root: root} } func (this *StreamChecker) Query(letter byte) bool { this.stream = append([]byte{letter}, this.stream...) node := this.root for _, char := range this.stream { if node.children[char] == nil { return false } node = node.children[char] if node.isEndOfWord { return true } } return false } Ставь 👍 и забирай 📚 Базу знаний
137
6
Задача: 1249. Minimum Remove to Make Valid Parentheses Сложность: medium Дана строка s из '(' , ')' и строчных английских символов. Ваша задача - удалить минимальное количество скобок ( '(' или ')' в любых позициях), чтобы полученная строка со скобками была допустимой, и вернуть любую допустимую строку. Формально строка со скобками допустима тогда и только тогда, когда: она пустая, содержит только строчные символы, или может быть записана как AB (A, конкатенированная с B), где A и B - допустимые строки, или может быть записана как (A), где A - допустимая строка. Пример: Input: s = "lee(t(c)o)de)" Output: "lee(t(c)o)de" 👨‍💻 Алгоритм: 1⃣Пройдите по строке s и сохраните индексы всех открывающих скобок '(' в стек. При встрече закрывающей скобки ')', удалите соответствующую открытую скобку из стека. Если в стеке нет соответствующей открывающей скобки, пометьте эту закрывающую скобку для удаления. 2⃣После первого прохода, все оставшиеся в стеке открывающие скобки пометьте для удаления. 3⃣Создайте новую строку, удалив все помеченные скобки. 😎 Решение: func minRemoveToMakeValid(s string) string {     stack := []int{}     res := []byte(s)     for i := 0; i < len(res); i++ {         if res[i] == '(' {             stack = append(stack, i)         } else if res[i] == ')' {             if len(stack) > 0 {                 stack = stack[:len(stack)-1]             } else {                 res[i] = '*'             }         }     }     for len(stack) > 0 {         res[stack[len(stack)-1]] = '*'         stack = stack[:len(stack)-1]     }     return strings.ReplaceAll(string(res), "*", "") } Ставь 👍 и забирай 📚 Базу знаний
146
7
Задача: 1180. Count Substrings with Only One Distinct Letter Сложность: easy Дана строка s. Верните количество подстрок, которые содержат только одну уникальную букву. Пример: Input: s = "aaaba" Output: 8 Explanation: The substrings with one distinct letter are "aaa", "aa", "a", "b". "aaa" occurs 1 time. "aa" occurs 2 times. "a" occurs 4 times. "b" occurs 1 time. So the answer is 1 + 2 + 4 + 1 = 8. 👨‍💻 Алгоритм: 1⃣Инициализируйте целочисленную переменную total для подсчета количества подстрок, а также два указателя left и right, которые отмечают начало и конец подстроки, содержащей только одну уникальную букву. 2⃣Итерируйте по строке S: Если мы не достигли конца и новый символ S[right] такой же, как и начальный символ S[left], увеличьте right на 1 для дальнейшего исследования строки S; в противном случае вычислите длину подстроки как right - left и примените формулу суммы арифметической последовательности; не забудьте установить right в left для начала исследования новой подстроки. 3⃣После завершения итерации добавьте к total количество подстрок для последнего сегмента, если он не был учтен. Верните значение total. 😎 Решение func countLetters(S string) int { total := 0 left := 0 for right := 0; right <= len(S); right++ { if right == len(S) || S[left] != S[right] { lenSubstring := right - left total += (1 + lenSubstring) * lenSubstring / 2 left = right } } return total } Ставь 👍 и забирай 📚 Базу знаний
164
8
Задача: 1020. Number of Enclaves Сложность: medium Вам дана двоичная матричная сетка m x n, где 0 обозначает морскую ячейку, а 1 - сухопутную. Ход состоит из перехода от одной сухопутной ячейки к другой соседней (в 4-х направлениях) или выхода за границу сетки. Верните количество сухопутных ячеек в сетке, для которых мы не можем выйти за границу сетки за любое количество ходов. Пример: Input: grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]] Output: 3 👨‍💻 Алгоритм: 1⃣Обработка граничных сухопутных ячеек: Пройдитесь по всем ячейкам, которые находятся на границе сетки (первый и последний ряды, первый и последний столбцы). Если ячейка содержит 1, начните поиск в глубину (DFS) или поиск в ширину (BFS), чтобы пометить все достижимые из нее сухопутные ячейки как посещенные. 2⃣Проверка всех ячеек: Пройдите по всем ячейкам матрицы, считая количество сухопутных ячеек, которые не были посещены в предыдущем шаге. 3⃣Возврат результата: Верните количество не посещенных сухопутных ячеек. 😎 Решение: func numEnclaves(grid [][]int) int { m, n := len(grid), len(grid[0]) var dfs func(x, y int) dfs = func(x, y int) { if x < 0 || y < 0 || x >= m || y >= n || grid[x][y] != 1 { return } grid[x][y] = 0 dfs(x+1, y) dfs(x-1, y) dfs(x, y+1) dfs(x, y-1) } for i := 0; i < m; i++ { if grid[i][0] == 1 { dfs(i, 0) } if grid[i][n-1] == 1 { dfs(i, n-1) } } for j := 0; j < n; j++ { if grid[0][j] == 1 { dfs(0, j) } if grid[m-1][j] == 1 { dfs(m-1, j) } } count := 0 for i := 0; i < m; i++ { for j := 0; j < n; j++ { if grid[i][j] == 1 { count++ } } } return count } Ставь 👍 и забирай 📚 Базу знаний
157
9
Задача: 171. Excel Sheet Column Number Сложность: easy Дана строка columnTitle, представляющая название столбца, как это отоб
Задача: 171. Excel Sheet Column Number Сложность: easy Дана строка columnTitle, представляющая название столбца, как это отображается в Excel. Вернуть соответствующий номер столбца. Пример: Input: columnTitle = "A" Output: 1 👨‍💻 Алгоритм: 1⃣Создайте отображение букв алфавита и их соответствующих значений (начиная с 1). 2⃣Инициализируйте переменную-аккумулятор result. 3⃣Начиная справа налево, вычислите значение символа в зависимости от его позиции и добавьте его к result. 😎 Решение: func titleToNumber(s string) int { result := 0 alpha_map := make(map[rune]int) for i := 0; i < 26; i++ { alpha_map[rune(i + 65)] = i + 1 } n := len(s) for i := 0; i < n; i++ { cur_char := rune(s[n - 1 - i]) result += alpha_map[cur_char] * pow(26, i) } return result } func pow(x int, y int) int { result := 1 for i := 0; i < y; i++ { result *= x } return result } Ставь 👍 и забирай 📚 Базу знаний
159
10
Задача: 820. Short Encoding of Words Сложность: medium Допустимым кодированием массива слов является любая опорная строка s и массив индексов indices, такие что: words.length == indices.length Опорная строка s заканчивается символом '#'. Для каждого индекса indices[i], подстрока строки s, начинающаяся с indices[i] и заканчивающаяся (но не включительно) следующим символом '#', равна words[i]. Дан массив слов, верните длину самой короткой возможной опорной строки s для любого допустимого кодирования слов. Пример: Input: words = ["time", "me", "bell"] Output: 10 Explanation: A valid encoding would be s = "time#bell#" and indices = [0, 2, 5]. words[0] = "time", the substring of s starting from indices[0] = 0 to the next '#' is underlined in "time#bell#" words[1] = "me", the substring of s starting from indices[1] = 2 to the next '#' is underlined in "time#bell#" words[2] = "bell", the substring of s starting from indices[2] = 5 to the next '#' is underlined in "time#bell#" 👨‍💻 Алгоритм: 1⃣Поскольку слово имеет не более 6 собственных суффиксов (так как words[i].length <= 7), давайте итерироваться по всем из них. Для каждого собственного суффикса мы попытаемся удалить его из нашего списка слов. Для эффективности сделаем words множеством. 2⃣Затем создадим список оставшихся слов и сформируем опорную строку, объединяя каждое слово с символом '#'. 3⃣В конце вернем длину полученной опорной строки. 😎 Решение: func minimumLengthEncoding(words []string) int { good := make(map[string]struct{}) for _, word := range words { good[word] = struct{}{} } for _, word := range words { for k := 1; k < len(word); k++ { delete(good, word[k:]) } } length := 0 for word := range good { length += len(word) + 1 } return length } Ставь 👍 и забирай 📚 Базу знаний
173
11
Задача: 712. Minimum ASCII Delete Sum for Two Strings Сложность: medium Если даны две строки s1 и s2, верните наименьшую ASCII-сумму удаленных символов, чтобы сделать две строки равными. Пример: Input: s1 = "sea", s2 = "eat" Output: 231 👨‍💻 Алгоритм: 1⃣Создайте двумерный массив dp размером (len(s1) + 1) x (len(s2) + 1), где dp[i][j] будет хранить наименьшую ASCII-сумму удаленных символов для первых i символов s1 и первых j символов s2. 2⃣Заполните первую строку и первый столбец массива dp суммами ASCII значений символов, которые необходимо удалить для достижения пустой строки. 3⃣Заполните оставшуюся часть массива dp следующим образом: Если символы s1[i-1] и s2[j-1] равны, dp[i][j] = dp[i-1][j-1]. Иначе, dp[i][j] = min(dp[i-1][j] + ord(s1[i-1]), dp[i][j-1] + ord(s2[j-1])). 😎 Решение: package main func minimumDeleteSum(s1 string, s2 string) int { dp := make([][]int, len(s1) + 1) for i := range dp { dp[i] = make([]int, len(s2) + 1) } for i := 1; i <= len(s1); i++ { dp[i][0] = dp[i - 1][0] + int(s1[i - 1]) } for j := 1; j <= len(s2); j++ { dp[0][j] = dp[0][j - 1] + int(s2[j - 1]) } for i := 1; i <= len(s1); i++ { for j := 1; j <= len(s2); j++ { if s1[i - 1] == s2[j - 1] { dp[i][j] = dp[i - 1][j - 1] } else { dp[i][j] = min(dp[i - 1][j] + int(s1[i - 1]), dp[i][j - 1] + int(s2[j - 1])) } } } return dp[len(s1)][len(s2)] } func min(a, b int) int { if a < b { return a } return b } Ставь 👍 и забирай 📚 Базу знаний
188
12
🔥 Скрытые вакансии с удаленной работой для Golang разработчика, которые нигде больше не публикуются. Напрямую от компаний, с
🔥 Скрытые вакансии с удаленной работой для Golang разработчика, которые нигде больше не публикуются. Напрямую от компаний, с контактами рекрутеров. 🔹 Golang Go Jobs | Вакансии 🔸 Все каналы с вакансиями
222
13
Задача: 1151. Minimum Swaps to Group All 1's Together Сложность: medium Дан бинарный массив data, необходимо вернуть минимальное количество перестановок, чтобы сгруппировать все 1, присутствующие в массиве, вместе в любом месте массива. Пример: Input: data = [1,0,1,0,1] Output: 1 Explanation: There are 3 ways to group all 1's together: [1,1,1,0,0] using 1 swap. [0,1,1,1,0] using 2 swaps. [0,0,1,1,1] using 1 swap. The minimum is 1. 👨‍💻 Алгоритм: 1⃣Используем два указателя, left и right, чтобы поддерживать скользящее окно длиной ones и проверяем каждый фрагмент массива data, подсчитывая количество единиц в нем (cnt_one) и запоминая максимальное значение max_one. 2⃣Пока окно скользит по массиву data, поддерживаем его длину равной ones. 3⃣Обновляем количество единиц в окне, добавляя новую границу data[right] и вычитая левую границу data[left]. 😎 Решение func minSwaps(data []int) int { ones := 0 for _, num := range data { ones += num } cnt_one, max_one := 0, 0 left, right := 0, 0 for right < len(data) { cnt_one += data[right] right++ if right - left > ones { cnt_one -= data[left] left++ } if cnt_one > max_one { max_one = cnt_one } } return ones - max_one } Ставь 👍 и забирай 📚 Базу знаний
230
14
Задача: №17. Letter Combinations of a Phone Number Сложность: medium Учитывая строку, содержащую цифры от 2 до 9 включительно, верните все возможные комбинации букв, которые может представлять число. Верните ответ в любом порядке. Соответствие цифр буквам (как на кнопках телефона) приведено ниже. Обратите внимание, что 1 не соответствует никаким буквам. Пример: Input: digits = "23" Output: ["ad","ae","af","bd","be","bf","cd","ce","cf"] 👨‍💻 Алгоритм: 1⃣Создать хэш-таблицу, сопоставляющую цифры 2-9 с соответствующими буквами. 2⃣Использовать рекурсивный backtracking, чтобы формировать комбинации, перебирая буквы для каждой цифры. 3⃣Добавлять полные комбинации в список результатов. 😎 Решение: func letterCombinations(digits string) []string { if len(digits) == 0 { return []string{} } phoneMap := map[byte]string{ '2': "abc", '3': "def", '4': "ghi", '5': "jkl", '6': "mno", '7': "pqrs", '8': "tuv", '9': "wxyz", } res := []string{} var backtrack func(int, string) backtrack = func(index int, path string) { if index == len(digits) { res = append(res, path) return } letters := phoneMap[digits[index]] for i := 0; i < len(letters); i++ { backtrack(index+1, path+string(letters[i])) } } backtrack(0, "") return res } Ставь 👍 и забирай 📚 Базу знаний
215
15
Задача: 659. Split Array into Consecutive Subsequences Сложность: medium Вам дан отсортированный в неубывающем порядке массив целых чисел nums. Определите, можно ли разделить nums на одну или несколько подпоследовательностей так, чтобы выполнялись оба следующих условия: Каждая подпоследовательность является последовательностью последовательных возрастающих чисел (то есть каждое целое число на 1 больше предыдущего). Все подпоследовательности имеют длину 3 или более. Верните true, если можно разделить nums согласно вышеуказанным условиям, или false в противном случае. Подпоследовательность массива — это новый массив, который формируется из исходного массива путем удаления некоторых (может быть, ни одного) элементов без нарушения относительных позиций оставшихся элементов. (например, [1,3,5] является подпоследовательностью [1,2,3,4,5], тогда как [1,3,2] не является). Пример: Input: nums = [1,2,3,3,4,5] Output: true 👨‍💻 Алгоритм: 1⃣Подсчет частоты элементов: Создайте хеш-таблицу для подсчета количества вхождений каждого элемента в массиве nums. 2⃣Создание подпоследовательностей: Создайте хеш-таблицу для отслеживания количества подпоследовательностей, которые могут быть продолжены для каждого элемента. Пройдите по каждому элементу в массиве и выполните следующие действия: Если элемент можно добавить к существующей подпоследовательности (проверяя хеш-таблицу подпоследовательностей), добавьте его и обновите хеш-таблицу. Если элемент нельзя добавить к существующей подпоследовательности, начните новую последовательность длиной 3 или более элементов. Если ни одно из условий не выполнено, верните false. 3⃣Проверка результата: Верните true, если все элементы успешно распределены по подпоследовательностям. 😎 Решение: func isPossible(nums []int) bool { freq := make(map[int]int) need := make(map[int]int) for _, num := range nums { freq[num]++ } for _, num := range nums { if freq[num] == 0 { continue } if need[num] > 0 { need[num]-- need[num+1]++ } else if freq[num+1] > 0 && freq[num+2] > 0 { freq[num+1]-- freq[num+2]-- need[num+3]++ } else { return false } freq[num]-- } return true } Ставь 👍 и забирай 📚 Базу знаний
232
16
Задача: 1189. Maximum Number of Balloons Сложность: easy Дана строка text. Вы хотите использовать символы строки text, чтобы сформировать как можно больше экземпляров слова "balloon". Каждый символ строки text можно использовать не более одного раза. Верните максимальное количество экземпляров, которые можно сформировать. Пример: Input: text = "nlaebolko" Output: 1 👨‍💻 Алгоритм: 1⃣Подсчитайте количество появлений каждого символа 'b', 'a', 'l', 'o', 'n' в строке text. 2⃣Вычислите потенциал для каждого символа: для 'b' и 'a' потенциал равен количеству их появлений, для 'l' и 'o' потенциал равен количеству их появлений, деленному на 2, а для 'n' потенциал равен количеству его появлений. 3⃣Найдите символ с наименьшим потенциалом среди 'b', 'a', 'l', 'o', 'n', который ограничивает количество возможных слов "balloon", и верните это значение. 😎 Решение func maxNumberOfBalloons(text string) int { bCount, aCount, lCount, oCount, nCount := 0, 0, 0, 0, 0 for _, c := range text { switch c { case 'b': bCount++ case 'a': aCount++ case 'l': lCount++ case 'o': oCount++ case 'n': nCount++ } } lCount /= 2 oCount /= 2 return min(bCount, aCount, lCount, oCount, nCount) } func min(a, b, c, d, e int) int { return min2(min2(a, b), min2(min2(c, d), e)) } func min2(x, y int) int { if x < y { return x } return y } Ставь 👍 и забирай 📚 Базу знаний
329
17
Задача: 389. Find the Difference Сложность: easy Даны две строки s и t. Строка t генерируется путем случайного перемешивания строки s с добавлением еще одной буквы в случайную позицию. Верните букву, которая была добавлена в t. Пример: Input: s = "abcd", t = "abcde" Output: "e" Explanation: 'e' is the letter that was added. 👨‍💻 Алгоритм: 1⃣Отсортируйте строки s и t. 2⃣Итерируйте по длине строк и сравнивайте их посимвольно. Это позволяет проверить, присутствует ли текущий символ строки t в строке s. 3⃣Как только встретится символ, который есть в строке t, но отсутствует в строке s, мы найдем лишний символ, который скрывала строка t все это время. 😎 Решение: package main import ( "sort" "strings" ) func findTheDifference(s string, t string) byte { sortedS := strings.Split(s, "") sortedT := strings.Split(t, "") sort.Strings(sortedS) sort.Strings(sortedT) for i := 0; i < len(sortedS); i++ { if sortedS[i] != sortedT[i] { return sortedT[i][0] } } return sortedT[len(sortedS)][0] } Ставь 👍 и забирай 📚 Базу знаний
286
18
Задача: 336. Palindrome Pairs Сложность: hard Вам дан массив уникальных строк words, индексируемый с 0. Пара палиндромов — это пара целых чисел (i, j), таких что: 0 <= i, j < words.length, i != j, и words[i] + words[j] (конкатенация двух строк) является палиндромом. Верните массив всех пар палиндромов из слов. Вы должны написать алгоритм с временной сложностью O(сумма длин всех слов в words). Пример: Input: words = ["abcd","dcba","lls","s","sssll"] Output: [[0,1],[1,0],[3,2],[2,4]] Explanation: The palindromes are ["abcddcba","dcbaabcd","slls","llssssll"] 👨‍💻 Алгоритм: 1⃣Инициализация и подготовка данных: Создайте структуру для хранения результатов (список пар индексов). Создайте словарь для хранения слов и их индексов, чтобы ускорить поиск. 2⃣Итерация по всем парам слов и проверка: Пройдите по всем парам слов в массиве words, используя два вложенных цикла. Для каждой пары слов проверяйте, образуют ли они палиндром при конкатенации. Это делается путем объединения строк и проверки, равна ли объединенная строка своей обратной версии. 3⃣Добавление найденных пар в результат: Если проверка на палиндром проходит, добавьте текущую пару индексов в список результатов. Верните итоговый список всех найденных пар. 😎 Решение: func palindromePairs(words []string) [][]int { var pairs [][]int for i := 0; i < len(words); i++ { for j := 0; j < len(words); j++ { if i == j { continue } combined := words[i] + words[j] if combined == reverseString(combined) { pairs = append(pairs, []int{i, j}) } } } return pairs } func reverseString(s string) string { runes := []rune(s) for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { runes[i], runes[j] = runes[j], runes[i] } return string(runes) } Ставь 👍 и забирай 📚 Базу знаний
311
19
🔥 Скрытые вакансии с удаленной работой для Golang разработчика, которые нигде больше не публикуются. Напрямую от компаний, с
🔥 Скрытые вакансии с удаленной работой для Golang разработчика, которые нигде больше не публикуются. Напрямую от компаний, с контактами рекрутеров. 🔹 Golang Go Jobs | Вакансии 🔸 Все каналы с вакансиями
347
20
🎓 Тестовый собес с Go Senior из Гамбурга, с опытом работы в Yandex и Uzum [ + эталонные ответы на 50 сложных вопросов в пода
🎓 Тестовый собес с Go Senior из Гамбурга, с опытом работы в Yandex и Uzum [ + эталонные ответы на 50 сложных вопросов в подарок ] В четверг, 8 октября, в 19:00 МСК приходи онлайн на тестовое собеседование. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью. Интервьюер: Маруф Караев — Senior Software Engineer из Гамбурга, ex-Yandex, ex-Uzum. Как это будет: 📂 Маруф задаст разработчику-добровольцу те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает; 📂 После каждого ответа Маруф даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе; 📂 В конце сможешь задать Маруфу любой вопрос и получить развёрнутый ответ; Эфир проходит в рамках менторской программы ШОРТКАТ для Go-разработчиков, которые хотят сменить работу и вырасти в грейде и зарплате. 🎁 Подарок для всех, кто зарегается на веб: файл с эталонными ответами на 50 сложных вопросов с Go-интервью 🔥 Жми на кнопку, чтобы попасть на эфир и забрать подарок ↓ @shortcut_go_bot Реклама. О рекламодателе.
238