Golang | LeetCode

channel icon
Сайт: easyoffer.ru

Условия размещения

Цена за 48 часов в ленте 750,00
Цена за 1 час закрепления N/A
Взаимопиар Нет
Дополнительные условия рекламы Отсутствуют
0
2 545
подписчиков
-1
323
охват 1 публикации
0
~2
постов / день
0,0%
12,7%
ERR % ?

Статистика

Последние публикации

Golang | LeetCode
21 декабря 2024 г. 19:07
#hard
Задача: 514. Freedom Trail

В видеоигре Fallout 4 в квесте "Дорога к свободе" игрокам нужно добраться до металлического диска, называемого "Кольцо Свободы", и использовать его для набора определённого ключевого слова, чтобы открыть дверь.

Дана строка ring, представляющая код, выгравированный на внешнем кольце, и другая строка key, представляющая ключевое слово, которое нужно набрать. Верните минимальное количество шагов, чтобы набрать все символы ключевого слова.

Изначально первый символ кольца выровнен в направлении "12 часов". Вы должны набирать все символы из строки key один за другим, поворачивая кольцо по часовой или против часовой стрелки, чтобы каждый символ строки key выровнять в направлении "12 часов", а затем нажимая на центральную кнопку.

На этапе вращения кольца для набора символа key[i]:

Вы можете вращать кольцо по часовой или против часовой стрелки на одно место, что считается одним шагом. Конечная цель вращения — выровнять один из символов кольца в направлении "12 часов", и этот символ должен быть равен key[i].
Если символ key[i] уже выровнен в направлении "12 часов", нажмите центральную кнопку, чтобы набрать его, что также считается одним шагом. После нажатия вы можете начинать набирать следующий символ из key (следующий этап). Иначе, вы завершили весь набор.

Пример:
Input: ring = "godding", key = "godding"
Output: 13


👨‍💻 Алгоритм:

1⃣Определите функцию countSteps для вычисления минимального пути между двумя индексами кольца ring. Создайте переменные ringLen и keyLen для хранения длин кольца и ключа соответственно. Создайте словарь bestSteps для хранения минимального количества шагов для нахождения символа на keyIndex, когда ringIndex кольца выровнен в позиции "12 часов".

2⃣Определите функцию tryLock, которая возвращает минимальное количество шагов для набора ключевого слова. Параметры: ringIndex, keyIndex, minSteps (минимальные шаги для набора ключевого слова на данный момент). Проверьте, равен ли keyIndex значению keyLen; если да, верните 0. Проверьте, есть ли пара (ringIndex, keyIndex) в bestSteps. Если есть, верните bestSteps[ringIndex][keyIndex]. Пройдите по каждому charIndex в ring. Если ring[charIndex] равен key[keyIndex], вычислите totalSteps, добавляя результат countSteps, единицу (нажатие центральной кнопки) и результат tryLock для следующего символа в key. Сохраните минимальное значение между totalSteps и текущим minSteps в minSteps. Сохраните minSteps для (ringIndex, keyIndex) в bestSteps.

3⃣Вызовите tryLock(0, 0, INT_MAX), начиная с нулевого индекса ring в позиции "12 часов" и первого символа в key. Наибольшее целое число передается как последний параметр, так как путь между нулевым индексом ring и первым символом key еще не определен.

😎 Решение:
import (
"math"
"strconv"
)

func findRotateSteps(ring string, key string) int {
ringLen := len(ring)
keyLen := len(key)
bestSteps := make(map[string]int)

countSteps := func(curr, next int) int {
stepsBetween := int(math.Abs(float64(curr - next)))
stepsAround := ringLen - stepsBetween
return int(math.Min(float64(stepsBetween), float64(stepsAround)))
}

var tryLock func(int, int) int
tryLock = func(ringIndex, keyIndex int) int {
keyPair := strconv.Itoa(ringIndex) + "-" + strconv.Itoa(keyIndex)
if val, ok := bestSteps[keyPair]; ok {
return val
}

if keyIndex == keyLen {
bestSteps[keyPair] = 0
return 0
}

minSteps := math.MaxInt32
for charIndex := 0; charIndex < ringLen; charIndex++ {
if ring[charIndex] == key[keyIndex] {
minSteps = int(math.Min(float64(minSteps),
float64(countSteps(ringIndex, charIndex) + 1 + tryLock(charIndex, keyIndex + 1))))
}
}
bestSteps[keyPair] = minSteps
return minSteps
}

return tryLock(0,


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
21 декабря 2024 г. 12:07
#medium
Задача: 513. Find Bottom Left Tree Value

Дан корень двоичного дерева, верните самое левое значение в последней строке дерева.

Пример:
Input: root = [2,1,3]
Output: 1


👨‍💻 Алгоритм:

1⃣Инициализируйте переменную maxDepth для хранения глубины нижнего уровня дерева. Инициализируйте переменную bottomLeftValue для хранения самого левого значения в последней строке дерева.

2⃣Реализуйте рекурсивную функцию dfs, которая обходит дерево и находит самое левое значение в последней строке дерева. Параметры функции: current (текущий узел) и depth (его глубина). Проверьте, пуст ли текущий узел. Если да, то вернитесь.

3⃣Проверьте, превышает ли текущая глубина глобальную переменную maxDepth. Если да, это значит, что мы нашли новый уровень. Установите maxDepth в значение текущей глубины. Установите bottomLeftValue в значение текущего узла. Рекурсивно вызовите dfs для левого поддерева текущего узла, увеличив глубину на один. Рекурсивно вызовите dfs для правого поддерева текущего узла, увеличив глубину на один. Вызовите dfs с корнем и начальной глубиной 0. Верните bottomLeftValue.

😎 Решение:
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}

type Solution struct {
maxDepth int
bottomLeftValue int
}

func (s *Solution) findBottomLeftValue(root *TreeNode) int {
s.maxDepth = -1
s.bottomLeftValue = 0
s.dfs(root, 0)
return s.bottomLeftValue
}

func (s *Solution) dfs(current *TreeNode, depth int) {
if current == nil {
return
}

if depth > s.maxDepth {
s.maxDepth = depth
s.bottomLeftValue = current.Val
}

s.dfs(current.Left, depth+1)
s.dfs(current.Right, depth+1)
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
20 декабря 2024 г. 19:07
#Hard
Задача: 600. Non-negative Integers without Consecutive Ones

Дано положительное целое число n, верните количество чисел в диапазоне [0, n], бинарные представления которых не содержат последовательных единиц.

Пример:
Input: n = 5
Output: 5
Explanation:
Here are the non-negative integers <= 5 with their corresponding binary representations:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
Among them, only integer 3 disobeys the rule (two consecutive ones) and the other 5 satisfy the rule.


👨‍💻 Алгоритм:

1⃣Простой метод заключается в переборе всех чисел от 1 до num. Для каждого текущего выбранного числа проверяем все соседние позиции, чтобы выяснить, содержит ли число две последовательные единицы. Если не содержит, увеличиваем количество чисел без последовательных единиц.

2⃣Чтобы проверить, существует ли 1 на позиции x (считая от младшего значащего бита), в текущем числе n, поступаем следующим образом. Сдвигаем двоичную 1 x−1 раз влево, чтобы получить число y, которое имеет 1 только на x-й позиции. Логическое И числа n и y даст результат 1 только если n содержит 1 на позиции x.

3⃣В конце подсчитываем и возвращаем количество чисел в диапазоне [0, n], не содержащих последовательных единиц.

😎 Решение:
func findIntegers(num int) int {
count := 0
for i := 0; i <= num; i++ {
if check(i) {
count++
}
}
return count
}

func check(n int) bool {
i := 31
for i > 0 {
if (n&(1< return false
}
i--
}
return true
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
20 декабря 2024 г. 12:07
#easy
Задача: 594. Longest Harmonious Subsequence

Мы определяем гармоничный массив как массив, в котором разница между его максимальным и минимальным значением составляет ровно 1.

Дан целочисленный массив nums, верните длину его самой длинной гармоничной подпоследовательности среди всех возможных подпоследовательностей.

Подпоследовательность массива - это последовательность, которую можно получить из массива, удалив некоторые или никакие элементы, не изменяя порядок оставшихся элементов.

Пример:
Input: nums = [1,3,2,2,5,2,3,7]
Output: 5
Explanation: The longest harmonious subsequence is [3,2,2,2,3].


👨‍💻 Алгоритм:

1⃣Пройдитесь по массиву, создавая словарь для подсчета частоты каждого элемента.

2⃣На каждой итерации проверьте, существуют ли в словаре элементы, отличающиеся на 1 от текущего, и обновите максимальную длину гармоничной подпоследовательности.

3⃣Верните максимальную длину гармоничной подпоследовательности.

😎 Решение:
func findLHS(nums []int) int {
count := make(map[int]int)
res := 0

for _, num := range nums {
count[num]++
if count[num+1] > 0 {
res = max(res, count[num]+count[num+1])
}
if count[num-1] > 0 {
res = max(res, count[num]+count[num-1])
}
}

return res
}

func max(a, b int) int {
if a > b {
return a
}
return b
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
19 декабря 2024 г. 19:07
#Easy
Задача: 599. Minimum Index Sum of Two Lists

Даны два массива строк list1 и list2, необходимо найти общие строки с наименьшей суммой индексов.

Общая строка - это строка, которая появляется и в list1, и в list2.

Общая строка с наименьшей суммой индексов - это общая строка, такая, что если она появилась в list1[i] и list2[j], то i + j должно быть минимальным значением среди всех других общих строк.

Верните все общие строки с наименьшей суммой индексов. Верните ответ в любом порядке.

Пример:
Input: list1 = ["Shogun","Tapioca Express","Burger King","KFC"], list2 = ["Piatti","The Grill at Torrey Pines","Hungry Hunter Steakhouse","Shogun"]
Output: ["Shogun"]
Explanation: The only common string is "Shogun".


👨‍💻 Алгоритм:

1⃣Для каждой строки из list1, сравниваем её с каждой строкой из list2, обходя весь список list2. Используем хэш-таблицу map, которая содержит элементы в виде (сумма: список строк). Здесь сумма относится к сумме индексов совпадающих элементов, а список строк соответствует списку совпадающих строк, чья сумма индексов равна этой сумме.

2⃣Во время сравнений, когда находится совпадение строки на i-м индексе из list1 и j-м индексе из list2, создаём запись в map, соответствующую сумме i + j, если такая запись ещё не существует. Если запись с этой суммой уже существует, добавляем текущую строку в список строк, соответствующих сумме i + j.

3⃣В конце обходим ключи в map и находим список строк, соответствующих ключу с минимальной суммой.

😎 Решение:
func findRestaurant(list1 []string, list2 []string) []string {
map := make(map[int][]string)
for i := 0; i < len(list1); i++ {
for j := 0; j < len(list2); j++ {
if list1[i] == list2[j] {
if _, ok := map[i+j]; !ok {
map[i+j] = []string{}
}
map[i+j] = append(map[i+j], list1[i])
}
}
}
minIndexSum := int(^uint(0) >> 1)
for key := range map {
if key < minIndexSum {
minIndexSum = key
}
}
return map[minIndexSum]
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
19 декабря 2024 г. 12:07
#Easy
Задача: 598. Range Addition II

Вам дана матрица M размером m x n, инициализированная нулями, и массив операций ops, где ops[i] = [ai, bi] означает, что значение M[x][y] должно быть увеличено на единицу для всех 0 <= x < ai и 0 <= y < bi.

Подсчитайте и верните количество максимальных чисел в матрице после выполнения всех операций.

Пример:
Input: m = 3, n = 3, ops = [[2,2],[3,3]]
Output: 4
Explanation: The maximum integer in M is 2, and there are four of it in M. So return 4.


👨‍💻 Алгоритм:

1⃣Все операции выполняются на прямоугольной подматрице изначальной матрицы M, заполненной нулями, с верхним левым углом в точке (0,0) и нижним правым углом для операции [i,j] в точке (i,j).

2⃣Максимальный элемент будет тем, на который выполнены все операции. Максимальные элементы будут находиться в области пересечения прямоугольников, представляющих операции. Для определения этой области нужно найти нижний правый угол пересекающейся области (x,y), который равен (min(op[0]), min(op[1])).

3⃣Количество элементов, находящихся в области пересечения, определяется как произведение координат x и y.

😎 Решение:
func maxCount(m int, n int, ops [][]int) int {
minA := m
minB := n
for _, op := range ops {
if op[0] < minA {
minA = op[0]
}
if op[1] < minB {
minB = op[1]
}
}
return minA * minB
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
18 декабря 2024 г. 19:07
#medium
Задача: 593. Valid Square

Даны координаты четырех точек в 2D-пространстве p1, p2, p3 и p4. Верните true, если эти четыре точки образуют квадрат.

Координата точки pi представлена как [xi, yi]. Ввод не дан в каком-либо определенном порядке.

Корректный квадрат имеет четыре равные стороны с положительной длиной и четыре равных угла (по 90 градусов).

Пример:
Input: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
Output: true


👨‍💻 Алгоритм:

1⃣Определите функцию для вычисления расстояния между двумя точками.

2⃣Проверьте, равны ли все стороны и диагонали для трех уникальных случаев перестановки точек.

3⃣Верните true, если хотя бы одна из проверок проходит.

😎 Решение:
package main

import (
"math"
)

func dist(p1, p2 []int) int {
return (p2[1]-p1[1])*(p2[1]-p1[1]) + (p2[0]-p1[0])*(p2[0]-p1[0])
}

func check(p1, p2, p3, p4 []int) bool {
return dist(p1, p2) > 0 &&
dist(p1, p2) == dist(p2, p3) &&
dist(p2, p3) == dist(p3, p4) &&
dist(p3, p4) == dist(p4, p1) &&
dist(p1, p3) == dist(p2, p4)
}

func validSquare(p1, p2, p3, p4 []int) bool {
return check(p1, p2, p3, p4) ||
check(p1, p3, p2, p4) ||
check(p1, p2, p4, p3)
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
18 декабря 2024 г. 12:07
#medium
Задача: 592. Fraction Addition and Subtraction

Дана строка, представляющая выражение сложения и вычитания дробей, верните результат вычисления в строковом формате.

Окончательный результат должен быть несократимой дробью. Если ваш окончательный результат является целым числом, преобразуйте его в формат дроби с знаменателем 1. Таким образом, 2 должно быть преобразовано в 2/1.

Пример:
Input: expression = "-1/2+1/2+1/3"
Output: "1/3"


👨‍💻 Алгоритм:

1⃣Начните сканирование строки и разделите её на части, содержащие числители и знаменатели, с учетом знаков.

2⃣Выполните операции сложения или вычитания для каждой пары дробей, приводя их к общему знаменателю и сокращая результат.

3⃣Верните результат в виде строки, представляющей несократимую дробь.

😎 Решение:
package main

import (
"fmt"
"strconv"
"strings"
)

func fractionAddition(expression string) string {
sign := []byte{}
if expression[0] != '-' {
sign = append(sign, '+')
}
for i := 0; i < len(expression); i++ {
if expression[i] == '+' || expression[i] == '-' {
sign = append(sign, expression[i])
}
}

fractions := strings.FieldsFunc(expression, func(r rune) bool { return r == '+' || r == '-' })
prevNum, prevDen := 0, 1
i := 0

for _, sub := range fractions {
if sub == "" {
continue
}
parts := strings.Split(sub, "/")
num, _ := strconv.Atoi(parts[0])
den, _ := strconv.Atoi(parts[1])
g := gcd(prevDen, den)
if sign[i] == '+' {
prevNum = prevNum*den/g + num*prevDen/g
} else {
prevNum = prevNum*den/g - num*prevDen/g
}
prevDen = prevDen * den / g
g = abs(gcd(prevDen, prevNum))
prevNum /= g
prevDen /= g
i++
}

return fmt.Sprintf("%d/%d", prevNum, prevDen)
}

func gcd(a, b int) int {
for b != 0 {
a, b = b, a%b
}
return a
}

func abs(a int) int {
if a < 0 {
return -a
}
return a
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
18 декабря 2024 г. 10:00
А вы знали что?...

🕵️В Windows есть папка, которая собирает на вас компромат!

Посмотрите видео выше — насколько легко узнать всю информацию о вас

Простых способов узнать о вас практически всё — сотни, и если вы хотите соблюдать хотя бы минимум сетевой гигиены — подпишитесь на IT ВЕДОМСТВО

Они рассказывает о признаках майнеров, как удалить трояны и порно-баннеры за 5 минут

Помимо всего этого, сейчас владелец канала проводит розыгрыш умной колонки, для всех новоприбывших подписчиков

💻 Подписываемся на IT ВЕДОМСТВОIT ВЕДОМСТВО — выигрываем призы и соблюдаем цифровую гигиену
Golang | LeetCode
17 декабря 2024 г. 19:07
#easy
Задача: 590. N-ary Tree Postorder Traversal

Дано корневое дерево с n-арной структурой, верните обход дерева в постфиксном порядке для значений его узлов.

Сериализация входных данных n-арного дерева представлена в обходе уровней. Каждая группа детей разделяется значением null (см. примеры).

Пример:
Input: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
Output: [2,6,14,11,7,3,12,8,4,13,9,10,5,1]


👨‍💻 Алгоритм:

1⃣Инициализируйте стек для хранения узлов и список для хранения значений узлов в обратном порядке.

2⃣Начните с корневого узла и добавьте его в стек. Пока стек не пуст, извлекайте узлы из стека, добавляя их значения в начало списка, и добавляйте всех его детей в стек.

3⃣В конце верните список значений узлов.

😎 Решение:
package main

type Node struct {
Val int
Children []*Node
}

func postorder(root *Node) []int {
if root == nil {
return []int{}
}

stack := []*Node{root}
output := []int{}

for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
output = append([]int{node.Val}, output...)
for _, child := range node.Children {
if child != nil {
stack = append(stack, child)
}
}
}

return output
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
17 декабря 2024 г. 12:07
#easy
Задача: 557. Reverse Words in a String III

Дана строка s. Необходимо изменить порядок символов в каждом слове в предложении, сохранив при этом пробелы и начальный порядок слов.

Пример:
Input: s = "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"


👨‍💻 Алгоритм:

1⃣Создайте переменную lastSpaceIndex и установите её значение в -1. Пройдите по каждому символу строки s от 0-го до n-го индекса, используя указатель strIndex.

2⃣Когда strIndex указывает на пробел, определите начало (startIndex = lastSpaceIndex + 1) и конец (endIndex = strIndex - 1) текущего слова. Используя два указателя, измените порядок символов в текущем слове.

3⃣Обновите lastSpaceIndex значением strIndex. После окончания цикла измените порядок символов в последнем слове (от lastSpaceIndex + 1 до конца строки).

😎 Решение:
package main

import (
"fmt"
)

func reverseWords(s string) string {
chars := []rune(s)
lastSpaceIndex := -1
len := len(chars)

for strIndex := 0; strIndex <= len; strIndex++ {
if strIndex == len || chars[strIndex] == ' ' {
startIndex := lastSpaceIndex + 1
endIndex := strIndex - 1
for startIndex < endIndex {
chars[startIndex], chars[endIndex] = chars[endIndex], chars[startIndex]
startIndex++
endIndex--
}
lastSpaceIndex = strIndex
}
}

return string(chars)
}

func main() {
s := "Let's take LeetCode contest"
fmt.Println(reverseWords(s)) // Output: "s'teL ekat edoCteeL tsetnoc"
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
16 декабря 2024 г. 19:07
#medium
Задача: 556. Next Greater Element III

Мы можем перемешать строку s, чтобы получить строку t, используя следующий алгоритм:

Дано положительное целое число n. Найдите наименьшее целое число, которое имеет точно такие же цифры, как и число n, и больше самого числа n по значению. Если такого положительного целого числа не существует, верните -1.

Учтите, что возвращенное число должно помещаться в 32-битное целое число. Если существует допустимый ответ, но он не помещается в 32-битное целое число, верните -1.

Пример:
Input: n = 12
Output: 21


👨‍💻 Алгоритм:

1⃣Нахождение и перестановка цифр
Преобразуйте число n в массив цифр. Найдите первую цифру, которая нарушает убывающий порядок (с конца массива). Назовем её индексом i. Найдите первую цифру, которая больше digits[i-1] (с конца массива). Назовем её индексом j. Поменяйте местами цифры на позициях i-1 и j.

2⃣Обратный порядок оставшихся цифр
Обратный порядок части массива от индекса i до конца, чтобы получить наименьшую перестановку, которая больше исходной.

3⃣Проверка результата и преобразование обратно в число
Преобразуйте массив цифр обратно в число. Если число превышает 32-битный предел, верните -1. В противном случае верните полученное число.

😎 Решение:
package main

import (
"fmt"
"sort"
"strconv"
)

func swap(s string, i0, i1 int) string {
if i0 == i1 {
return s
}
runes := []rune(s)
runes[i0], runes[i1] = runes[i1], runes[i0]
return string(runes)
}

var list []string

func permute(a string, l, r int) {
if l == r {
list = append(list, a)
} else {
for i := l; i <= r; i++ {
a = swap(a, l, i)
permute(a, l+1, r)
a = swap(a, l, i)
}
}
}

func nextGreaterElement(n int) int {
s := strconv.Itoa(n)
list = []string{}
permute(s, 0, len(s)-1)
sort.Strings(list)
for i := range list {
if list[i] == s {
if i < len(list)-1 {
result, _ := strconv.Atoi(list[i+1])
if result <= 2147483647 {
return result
}
}
}
}
return -1
}

func main() {
n := 12345
fmt.Println(nextGreaterElement(n)) // Output: 12354
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
16 декабря 2024 г. 12:07
#medium
Задача: 554. Brick Wall

Перед вами находится прямоугольная кирпичная стена с n рядами кирпичей. В i-м ряду находится несколько кирпичей одинаковой высоты (то есть один юнит), но они могут быть разной ширины. Общая ширина каждого ряда одинакова.

Нарисуйте вертикальную линию от верха до низа, пересекающую наименьшее количество кирпичей. Если ваша линия проходит по краю кирпича, то кирпич не считается пересеченным. Вы не можете нарисовать линию прямо по одному из двух вертикальных краев стены, так как в этом случае линия очевидно не пересечет ни одного кирпича.

Дан двумерный массив wall, содержащий информацию о стене, верните минимальное количество пересеченных кирпичей после проведения такой вертикальной линии.

Пример:
Input: wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
Output: 2


👨‍💻 Алгоритм:

1⃣Определите общую ширину стены, сложив ширины кирпичей в первом ряду. Создайте массив pos, где pos[i] указывает на текущую позицию в i-ом ряду.

2⃣Пройдите по каждой возможной позиции для вертикальной линии (от 1 до общей ширины стены - 1). Для каждой позиции обновите массив pos, проверяя, пересекает ли линия границу кирпича. Если пересекает, увеличьте значение pos[i].

3⃣Подсчитайте количество кирпичей, которые пересечет вертикальная линия для каждой возможной позиции, обновляя счетчик. Выберите минимальное количество пересеченных кирпичей из всех возможных позиций для вертикальной линии.

😎 Решение:
package main

import (
"math"
)

func leastBricks(wall [][]int) int {
pos := make([]int, len(wall))
sum := 0
res := math.MaxInt32

for _, el := range wall[0] {
sum += el
}

for sum != 0 {
count := 0
for i := 0; i < len(wall); i++ {
if wall[i][pos[i]] != 0 {
count++
} else {
pos[i]++
}
wall[i][pos[i]]--
}
sum--
res = min(res, count)
}

return res
}

func min(a, b int) int {
if a < b {
return a
}
return b
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
15 декабря 2024 г. 19:07
#hard
Задача: 420. Strong Password Checker

Пароль считается надежным, если выполняются следующие условия: в нем не менее 6 и не более 20 символов. он содержит не менее одной строчной буквы, не менее одной заглавной буквы и не менее одной цифры. он не содержит трех повторяющихся символов подряд (например, "Baaabb0" - слабый, а "Baaba0" - сильный). Учитывая строку пароля, верните минимальное количество шагов, необходимых для того, чтобы сделать пароль сильным. Если пароль уже сильный, верните 0. За один шаг можно: вставить один символ в пароль, удалить один символ из пароля или заменить один символ пароля другим символом.

Пример:
Input: password = "a"
Output: 5


👨‍💻 Алгоритм:

1⃣Определите количество недостающих символов до минимума и превышающих символов для ограничения длины пароля. Также определите наличие строчных, заглавных букв и цифр.

2⃣Вычислите количество необходимых замен для устранения трех повторяющихся символов подряд.

3⃣Определите минимальное количество шагов для приведения пароля к требуемым условиям, используя вычисленные значения недостающих символов, превышающих символов и замен.

😎 Решение:
package main

import (
"unicode"
)

func strongPasswordChecker(s string) int {
n := len(s)
hasLower, hasUpper, hasDigit := false, false, false
repeatCount := 0

for i := 0; i < n; {
if unicode.IsLower(rune(s[i])) {
hasLower = true
}
if unicode.IsUpper(rune(s[i])) {
hasUpper = true
}
if unicode.IsDigit(rune(s[i])) {
hasDigit = true
}

start := i
for i < n && s[i] == s[start] {
i++
}
repeatCount += (i - start) / 3
}

missingTypes := 0
if !hasLower {
missingTypes++
}
if !hasUpper {
missingTypes++
}
if !hasDigit {
missingTypes++
}

if n < 6 {
return max(missingTypes, 6-n)
} else if n <= 20 {
return max(missingTypes, repeatCount)
} else {
excessChars := n - 20
overLenReduction := 0
for i := 2; i < n && excessChars > 0; i++ {
if i%3 == 2 && s[i] == s[i-1] && s[i] == s[i-2] {
overLenReduction++
excessChars--
}
}
repeatCount -= overLenReduction
return (n - 20) + max(missingTypes, repeatCount)
}
}

func max(a, b int) int {
if a > b {
return a
}
return b
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
15 декабря 2024 г. 12:07
#medium
Задача: 553. Optimal Division

Дано целочисленный массив nums. Соседние целые числа в nums будут выполнять деление с плавающей запятой.

Например, для nums = [2,3,4] мы будем вычислять выражение "2/3/4".
Однако, вы можете добавить любое количество скобок в любое место, чтобы изменить приоритет операций. Вы хотите добавить эти скобки так, чтобы значение выражения после вычисления было максимальным.

Верните соответствующее выражение, которое имеет максимальное значение в строковом формате.

Пример:
Input: nums = [1000,100,10,2]
Output: "1000/(100/10/2)"
Explanation: 1000/(100/10/2) = 1000/((100/10)/2) = 200
However, the bold parenthesis in "1000/((100/10)/2)" are redundant since they do not influence the operation priority.
So you should return "1000/(100/10/2)".
Other cases:
1000/(100/10)/2 = 50
1000/(100/(10/2)) = 50
1000/100/10/2 = 0.5
1000/100/(10/2) = 2


👨‍💻 Алгоритм:

1⃣Разверните оба числа. Инициализируйте массив ans с (N+M) нулями. Для каждой цифры во втором числе: держите переменную переноса, изначально равную 0. Инициализируйте массив (currentResult), начинающийся с некоторых нулей в зависимости от места цифры во втором числе.

2⃣Для каждой цифры первого числа: умножьте цифру второго числа на цифру первого числа и добавьте предыдущий перенос к результату умножения. Возьмите остаток от деления на 10, чтобы получить последнюю цифру. Добавьте последнюю цифру к массиву currentResult. Разделите результат умножения на 10, чтобы получить новое значение переноса.

3⃣После итерации по каждой цифре в первом числе, если перенос не равен нулю, добавьте перенос к массиву currentResult. Добавьте currentResult к массиву ans. Если последняя цифра в ans равна нулю, перед разворотом ans удалите этот ноль, чтобы избежать ведущего нуля в окончательном ответе. Разверните ans и верните его.

😎 Решение:
package main

import (
"fmt"
"strconv"
)

func addStrings(num1 []int, num2 []int) []int {
var ans []int
carry := 0
n1, n2 := len(num1), len(num2)

for i := 0; i < max(n1, n2) || carry != 0; i++ {
digit1, digit2 := 0, 0
if i < n1 {
digit1 = num1[i]
}
if i < n2 {
digit2 = num2[i]
}
sum := digit1 + digit2 + carry
carry = sum / 10
ans = append(ans, sum%10)
}
return ans
}

func multiplyOneDigit(firstNumber string, secondNumberDigit rune, numZeros int) []int {
var currentResult []int
for i := 0; i < numZeros; i++ {
currentResult = append(currentResult, 0)
}
carry := 0

for _, digit := range firstNumber {
multiplication := (int(secondNumberDigit-'0') * int(digit-'0')) + carry
carry = multiplication / 10
currentResult = append(currentResult, multiplication%10)
}
if carry != 0 {
currentResult = append(currentResult, carry)
}
return currentResult
}

func multiply(firstNumber string, secondNumber string) string {
if firstNumber == "0" || secondNumber == "0" {
return "0"
}

firstNumberRev := reverseString(firstNumber)
secondNumberRev := reverseString(secondNumber)

ans := make([]int, len(firstNumber)+len(secondNumber))

for i, digit := range secondNumberRev {
ans = addStrings(multiplyOneDigit(firstNumberRev, digit, i), ans)
}

for len(ans) > 1 && ans[len(ans)-1] == 0 {
ans = ans[:len(ans)-1]
}

result := ""
for i := len(ans) - 1; i >= 0; i-- {
result += strconv.Itoa(ans[i])
}

return result
}

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)
}

func max(a, b int) int {
if a > b {
return a
}
return b
}

func main() {
fmt.Println(multiply("123", "456"))
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
15 декабря 2024 г. 10:00
✅️ GitHubGitHub теперь в Telegram!

Подписывайтесь: @GitHub
Golang | LeetCode
14 декабря 2024 г. 19:07
#medium
Задача: 419. Battleships in a Board

Если задана матричная доска размером m x n, где каждая клетка - линкор 'X' или пустая '.', верните количество линкоров на доске. Линкоры могут располагаться на доске только горизонтально или вертикально. Другими словами, они могут быть выполнены только в форме 1 x k (1 строка, k столбцов) или k x 1 (k строк, 1 столбец), где k может быть любого размера. Между двумя линкорами есть хотя бы одна горизонтальная или вертикальная клетка (т. е. нет соседних линкоров).

Пример:
Input: board = [["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]
Output: 2


👨‍💻 Алгоритм:

1⃣Пройдите по каждой клетке матрицы.

2⃣Если текущая клетка содержит 'X' и она не является продолжением линкора (т.е. не имеет 'X' сверху или слева), увеличьте счетчик линкоров.

3⃣Верните итоговый счетчик.

😎 Решение:
package main

func countBattleships(board [][]byte) int {
m, n := len(board), len(board[0])
count := 0

for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if board[i][j] == 'X' {
if (i == 0 || board[i-1][j] == '.') && (j == 0 || board[i][j-1] == '.') {
count++
}
}
}
}

return count
}


Ставь
👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
14 декабря 2024 г. 12:07
#medium
Задача: 418. Sentence Screen Fitting

Если задан экран rows x cols и предложение, представленное в виде списка строк, верните количество раз, которое данное предложение может быть помещено на экран. Порядок слов в предложении должен оставаться неизменным, и слово не может быть разбито на две строки. Два последовательных слова в строке должны разделяться одним пробелом.

Пример:
Input: sentence = ["hello","world"], rows = 2, cols = 8
Output: 1


👨‍💻 Алгоритм:

1⃣Преобразуйте предложение в единую строку с пробелами между словами и пробелом в конце.

2⃣Инициализируйте переменную для отслеживания текущей позиции в строке предложения. Для каждой строки экрана добавляйте количество символов, равное числу столбцов.

3⃣Если следующая позиция является пробелом, увеличивайте счетчик. Если нет, уменьшайте счетчик, пока не найдете пробел, чтобы избежать разрыва слова.

😎 Решение:
package main

func wordsTyping(sentence []string, rows int, cols int) int {
sentenceStr := ""
for _, word := range sentence {
sentenceStr += word + " "
}
length := len(sentenceStr)
count := 0

for i := 0; i < rows; i++ {
count += cols
if sentenceStr[count % length] == ' ' {
count++
} else {
for count > 0 && sentenceStr[(count - 1) % length] != ' ' {
count--
}
}
}

return count / length
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний
Golang | LeetCode
13 декабря 2024 г. 20:28
Нужен человек, для сбора вопросов из собеседований на должность Golang разработчик.Golang разработчик.

Что надо делать:
1. Смотреть записи собеседований (список будет дан)
2. Выписывать вопросы, которые задают кандидату

Ставка: 450 руб. / час
Примерная ЗП: 54 000 руб. / месяц (4 часа в день)

Если интересно и можешь уделять работе от 4 часов / день, то отправь сообщение и сразу напиши какие языки программирования знаешь и какие лучше всего?
Golang | LeetCode
13 декабря 2024 г. 19:07
#medium
Задача: 417. Pacific Atlantic Water Flow

Имеется прямоугольный остров размером m x n, который граничит с Тихим и Атлантическим океанами. Тихий океан касается левого и верхнего краев острова, а Атлантический океан - правого и нижнего краев. Остров разбит на сетку квадратных ячеек. Вам дана целочисленная матрица heights размером m x n, где heights[r][c] - высота над уровнем моря клетки с координатами (r, c). На острове выпадает много осадков, и дождевая вода может стекать в соседние клетки прямо на север, юг, восток и запад, если высота соседней клетки меньше или равна высоте текущей клетки. Вода может течь из любой клетки, прилегающей к океану, в океан. Верните двумерный список координат сетки result, где result[i] = [ri, ci] означает, что дождевая вода может течь из клетки (ri, ci) как в Тихий, так и в Атлантический океаны.

Пример:
Input: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]]
Output: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]


👨‍💻 Алгоритм:

1⃣Определите две матрицы для отслеживания клеток, из которых вода может течь в Тихий и Атлантический океаны, используя поиск в глубину (DFS) или поиск в ширину (BFS), начиная с границ, примыкающих к каждому океану.

2⃣Выполните поиск для каждого океана, обновляя матрицы достижимости.

3⃣Соберите координаты клеток, которые могут стекать в оба океана, проверяя пересечение двух матриц достижимости.

😎 Решение:
package main

func pacificAtlantic(heights [][]int) [][]int {
m, n := len(heights), len(heights[0])
pacific := make([][]bool, m)
atlantic := make([][]bool, m)
for i := range pacific {
pacific[i] = make([]bool, n)
atlantic[i] = make([]bool, n)
}
directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

var dfs func(r, c int, ocean [][]bool)
dfs = func(r, c int, ocean [][]bool) {
ocean[r][c] = true
for _, dir := range directions {
nr, nc := r+dir[0], c+dir[1]
if nr >= 0 && nc >= 0 && nr < m && nc < n && !ocean[nr][nc] && heights[nr][nc] >= heights[r][c] {
dfs(nr, nc, ocean)
}
}
}

for i := 0; i < m; i++ {
dfs(i, 0, pacific)
dfs(i, n-1, atlantic)
}
for j := 0; j < n; j++ {
dfs(0, j, pacific)
dfs(m-1, j, atlantic)
}

result := [][]int{}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if pacific[i][j] && atlantic[i][j] {
result = append(result, []int{i, j})
}
}
}
return result
}


Ставь 👍👍 и забирай 📚 📚 Базу знанийБазу знаний