Golang | LeetCode
3.92K subscribers
173 photos
1.05K links
Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.iss.one/+MVqzqT6ZzFFhYjhi
Вопросы собесов t.iss.one/+ajHN0OKU1okyZDky
Вакансии t.iss.one/+mX_RBWjiMTExODUy
Download Telegram
#medium
Задача: 164. Maximum Gap

Дан массив целых чисел nums. Верните максимальную разницу между двумя последовательными элементами в его отсортированной форме. Если массив содержит менее двух элементов, верните 0.

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

Пример:
Input: nums = [3,6,9,1]
Output: 3
Explanation: The sorted form of the array is [1,3,6,9], either (3,6) or (6,9) has the maximum difference 3.


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

1️⃣Инициализация:
Определите минимальное и максимальное значения в массиве для расчета возможного максимального интервала (разрыва) между элементами в идеально распределенном массиве.
Вычислите размер ведра (bucket size), необходимый для размещения всех элементов массива так, чтобы если массив был равномерно распределен, каждый ведер должен содержать хотя бы один элемент. Размер ведра = (max_value - min_value) / (количество элементов - 1).

2️⃣Размещение элементов в ведрах:
Создайте ведра для хранения минимальных и максимальных значений каждого ведра. Используйте формулу для распределения каждого элемента в соответствующем ведре на основе его значения.
Игнорируйте пустые ведра при расчете максимального интервала.

3️⃣Вычисление максимального интервала:
Пройдите через ведра и вычислите максимальный интервал, сравнивая минимальное значение текущего непустого ведра с максимальным значением предыдущего непустого ведра.
Максимальный интервал будет наибольшей разницей между "минимальными" и "максимальными" значениями последовательных непустых ведер.

😎 Решение:
func maximumGap(nums []int) int {
if len(nums) < 2 {
return 0
}

sort.Ints(nums)
maxGap := 0

for i := 0; i < len(nums)-1; i++ {
diff := nums[i+1] - nums[i]
if diff > maxGap {
maxGap = diff
}
}

return maxGap
}


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
💊2🤔1
#medium
Задача: 165. Compare Version Numbers

Даны две строки версий version1 и version2. Сравните их, учитывая, что:
- Версии состоят из ревизий, разделенных точками ..
- Ревизии интерпретируются как целые числа (игнорируем ведущие нули).
- Если одна из версий короче, недостающие ревизии считаются 0.

Возвращаем:
- 1, если version1 > version2.
- -1, если version1 < version2.
- 0, если версии равны.

Пример:
Input: version1 = "1.2", version2 = "1.10"  
Output: -1
Explanation: 2 < 10, значит version1 < version2.

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

1️⃣ Разделить строки по .tokens1 и tokens2.

2️⃣ Итерировать по наибольшей длине, преобразуя ревизии в int.

3️⃣ Сравнить ревизии:
- Если i1 > i2return 1.
- Если i1 < i2return -1.

4️⃣ Если все ревизии равны → вернуть 0.

😎 Решение:
func compareVersion(version1 string, version2 string) int {
tokens1 := strings.Split(version1, ".")
tokens2 := strings.Split(version2, ".")

for i := 0; i < max(len(tokens1), len(tokens2)); i++ {
i1, i2 := 0, 0
if i < len(tokens1) {
i1, _ = strconv.Atoi(tokens1[i])
}
if i < len(tokens2) {
i2, _ = strconv.Atoi(tokens2[i])
}

if i1 > i2 {
return 1
} else if i1 < i2 {
return -1
}
}

return 0
}

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


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
#medium
Задача: 166. Fraction to Recurring Decimal

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

Если дробная часть повторяется, заключите повторяющуюся часть в скобки.

Если возможны несколько ответов, верните любой из них.

Гарантируется, что длина строки ответа будет меньше 10^4 для всех предоставленных входных данных.

Пример:
Input: numerator = 1, denominator = 2
Output: "0.5"


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

1️⃣Использование хеш-таблицы для отслеживания остатков:
Создайте хеш-таблицу для хранения соответствия между остатком от деления и его позицией в дробной части. Это поможет определить начало повторяющейся части.
Для каждого нового остатка вычислите следующую цифру результата деления и проверьте, был ли такой остаток уже получен ранее.

2️⃣Обработка нулевого остатка:
Если в процессе деления остаток становится равным нулю, это означает, что дробная часть не повторяется и процесс можно завершать.

3️⃣Учет особенностей:
Будьте осторожны с крайними случаями, такими как отрицательные дроби или особо сложные случаи, например, деление −1 на −2147483648. В этих случаях следует корректно обрабатывать знаки и возможные переполнения.

😎 Решение:
func fractionToDecimal(numerator int, denominator int) string {
if numerator == 0 {
return "0"
}
var fraction []string
if (numerator < 0) != (denominator < 0) {
fraction = append(fraction, "-")
}
dividend := absInt(numerator)
divisor := absInt(denominator)
fraction = append(fraction, strconv.Itoa(dividend/divisor))
remainder := dividend % divisor
if remainder == 0 {
return strings.Join(fraction, "")
}
fraction = append(fraction, ".")
valMap := make(map[int]int)
for remainder != 0 {
if pos, ok := valMap[remainder]; ok {
fraction = append(
fraction[:pos],
append([]string{"("}, append(fraction[pos:], ")")...)...)
break
}
valMap[remainder] = len(fraction)
remainder *= 10
fraction = append(fraction, strconv.Itoa(remainder/divisor))
remainder %= divisor
}
return strings.Join(fraction, "")
}

func absInt(val int) int {
if val < 0 {
return -val
}
return val
}


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
#medium
Задача: 167. Two Sum II - Input Array Is Sorted

Дан массив целых чисел numbers, индексированный с 1, который уже отсортирован в неубывающем порядке. Найдите два числа так, чтобы их сумма составляла заданное целевое число. Пусть эти два числа будут numbers[index1] и numbers[index2], где 1 <= index1 < index2 <= numbers.length.

Верните индексы этих двух чисел, index1 и index2, увеличенные на один, в виде массива из двух элементов [index1, index2].

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

Ваше решение должно использовать только константное дополнительное пространство.

Пример:
Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore, index1 = 1, index2 = 2. We return [1, 2].


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

1️⃣Инициализация указателей:
Используйте два указателя: один (left) начинается с начала массива, а другой (right) - с конца.

2️⃣Поиск решения:
Сравните сумму элементов, на которые указывают left и right, с целевым значением target.
Если сумма равна target, верните индексы этих элементов как решение.
Если сумма меньше target, увеличьте left (так как массив отсортирован и увеличение left увеличивает сумму).
Если сумма больше target, уменьшите right (чтобы уменьшить сумму).

3️⃣Продолжение до нахождения решения:
Перемещайте указатели left и right, повторяя сравнение, пока не будет найдено решение.
Учитывая, что задача гарантирует существование ровно одного решения, этот метод всегда найдет ответ.

😎 Решение:
func twoSum(numbers []int, target int) []int {
low := 0
high := len(numbers) - 1
for low < high {
sum := numbers[low] + numbers[high]

if sum == target {
return []int{low + 1, high + 1}
} else if sum < target {
low++
} else {
high--
}
}
return []int{-1, -1}
}


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1🤔1
#easy
Задача: 168. Excel Sheet Column Title

Дано целое число columnNumber, верните соответствующий заголовок столбца, как он отображается в таблице Excel.

Например:
A -> 1
B -> 2
C -> 3
Z -> 26
AA -> 27
AB -> 28

Пример:
Input: columnNumber = 1
Output: "A"


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

1️⃣Инициализация пустой строки ans:
Создайте пустую строку ans, которая будет хранить заголовок столбца.

2️⃣Циклическое преобразование числа в буквы:
Пока columnNumber больше 0, выполняйте следующие действия:
Вычтите 1 из columnNumber для корректировки индекса (Excel использует 1-индексацию).
Найдите символ, соответствующий остатку от деления columnNumber на 26, и добавьте его в начало строки ans.
Присвойте columnNumber значение от деления columnNumber на 26

3️⃣Переворот и возврат результата:
Так как символы добавляются в начало строки, то по завершению цикла строка ans содержит заголовок столбца в обратном порядке. Переверните строку ans, чтобы представить её в правильном порядке.
Верните полученный заголовок столбца.

😎 Решение:
func convertToTitle(columnNumber int) string {
ans := ""
for columnNumber > 0 {
columnNumber = columnNumber - 1
ans = string(rune((columnNumber)%26+'A')) + ans
columnNumber = (columnNumber) / 26
}

return ans
}


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
#easy
Задача: 169. Majority Element

Дан массив nums размера n, верните элемент большинства.

Элемент большинства — это элемент, который встречается более чем ⌊n / 2⌋ раз. Можно предположить, что элемент большинства всегда существует в массиве.

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


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

1️⃣Использование HashMap для подсчета:
Создайте HashMap для отслеживания количества каждого элемента в массиве.

2️⃣Подсчет вхождений элементов:
Пройдите по массиву nums, увеличивая счетчик в HashMap для каждого элемента.

3️⃣Поиск элемента большинства:
Определите элемент большинства, просмотрев HashMap и найдя ключ с максимальным значением, которое должно быть больше ⌊n / 2⌋

😎 Решение:
func majorityElement(nums []int) int {
counts := make(map[int]int)
for _, num := range nums {
if _, ok := counts[num]; ok {
counts[num]++
} else {
counts[num] = 1
}
}
for num, count := range counts {
if count > len(nums)/2 {
return num
}
}
return 0
}


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤔1
#easy
Задача: 170. Two Sum III - Data structure design

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

Реализуйте класс TwoSum:

- TwoSum() инициализирует объект TwoSum с изначально пустым массивом.
- void add(int number) добавляет число в структуру данных.
- boolean find(int value) возвращает true, если существует хотя бы одна пара чисел, сумма которых равна значению value, в противном случае возвращает false.

Пример:
Input
["TwoSum", "add", "add", "add", "find", "find"]
[[], [1], [3], [5], [4], [7]]
Output
[null, null, null, null, true, false]


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

1️⃣Инициализация указателей:
Инициализируйте два указателя low и high, которые указывают на первый и последний элементы списка соответственно.

2️⃣Итерация с использованием двух указателей:
Запустите цикл для итерации по списку. Цикл завершится, когда будет найдено решение с двумя суммами или когда два указателя встретятся.
На каждом шаге цикла перемещайте один из указателей в зависимости от различных условий:
Если сумма элементов, на которые указывают текущие указатели, меньше желаемого значения, то необходимо попытаться увеличить сумму для достижения желаемого значения, то есть переместить указатель low вперёд для получения большего значения.
Если сумма элементов больше желаемого значения, то следует попытаться уменьшить сумму, перемещая указатель high в сторону указателя low.
Если сумма равна желаемому значению, можно сразу выполнить возврат из функции.

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

😎 Решение:
type TwoSum struct {
nums []int
is_sorted bool
}

func Constructor() TwoSum {
return TwoSum{nums: []int{}, is_sorted: false}
}

func (this *TwoSum) Add(number int) {
this.nums = append(this.nums, number)
this.is_sorted = false
}

func (this *TwoSum) Find(value int) bool {
if !this.is_sorted {
sort.Ints(this.nums)
this.is_sorted = true
}
low, high := 0, len(this.nums)-1
for low < high {
var twosum int = this.nums[low] + this.nums[high]
if twosum < value {
low += 1
} else if twosum > value {
high -= 1
} else {
return true
}
}
return false
}


🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM