Kotlin | LeetCode
1.83K subscribers
171 photos
1 video
1.11K links
Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.iss.one/+Gzg9SH2MNxM0ZTYy
Вопросы соебсов t.iss.one/+OOb6zFa_-Oo3NjZi
Вакансии t.iss.one/+KuGNaHeKkQg1NzAy
Download Telegram
Channel created
Задача: №16. 3Sum Closest #medium

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


Решение:
class Solution {
fun threeSumClosest(nums: IntArray, target: Int): Int {
Arrays.sort(nums)
var numsLen = nums.size
var lastTwoSum = nums[numsLen - 1] + nums[numsLen - 2]
var result = 0
var distance = Integer.MAX_VALUE

if (nums[0] + nums[1] + nums[2] > target) return nums[0] + nums[1] + nums[2]
if (lastTwoSum + nums[numsLen - 3] < target) return lastTwoSum + nums[numsLen - 3]
if (nums[0] == nums[numsLen - 1]) return 3 * nums[0]

for (i in 0..(numsLen - 3)) {
var cur0 = nums[i]
if (i == 0 || cur0 != nums[i-1]) {
if (cur0 + nums[i + 1] + nums[i + 2] > target) {
if (cur0 + nums[i + 1] + nums[i + 2] - target < distance)
result = cur0 + nums[i + 1] + nums[i + 2]
break
}
if (cur0 + lastTwoSum <= target) {
if (target - cur0 + lastTwoSum < distance) {
distance = target - cur0 + lastTwoSum
result = cur0 + lastTwoSum
}
continue
}
var left = i + 1
var right = numsLen - 1
while (left < right) {
var sum = cur0 + nums[left] + nums[right]
if (sum == target) return target
if (Math.abs(target - sum) < distance) {
distance = Math.abs(target - sum)
result = sum
}
if (sum > target)
right--
else
left++
}
}
}
return result
}
}


Пояснение:
Сортировка: Сначала массив nums сортируется для упрощения поиска.
Инициализация переменных: Определяются переменные для хранения длины массива, суммы последних двух элементов и начального значения результата.
Основной цикл: Проходит по каждому элементу массива, рассматривая его как первый элемент тройки.
Двухуказательный метод: Использует два указателя для поиска двух других элементов массива, которые вместе с текущим элементом дадут сумму, наиболее близкую к target.
Проверка и обновление результата: Сравнивает текущую сумму с целевым значением и обновляет результат, если находится более близкая сумма.
Возврат результата: Функция возвращает сумму, которая является наилучшей суммой тройки элементов, наиболее близкой к целевому значению.
👍1
Задача: №17. Letter Combinations of a Phone Number #medium

Условие:
Учитывая строку, содержащую цифры от 2 до 9 включительно, верните все возможные комбинации букв, которые может представлять число. Верните ответ в любом порядке. Соответствие цифр буквам (как на кнопках телефона) приведено ниже. Обратите внимание, что 1 не соответствует никаким буквам.


Решение:
class Solution {

fun letterCombinations(digits: String): List<String> =
digits.takeIf { it.isNotEmpty() }?.fold(listOf("")) { acc, c ->
c.letters.flatMap { letter -> acc.map { it + letter } }
} ?: emptyList()

private val Char.letters get() = when(this) {
'2' -> listOf('a', 'b', 'c')
'3' -> listOf('d', 'e', 'f')
'4' -> listOf('g', 'h', 'i')
'5' -> listOf('j', 'k', 'l')
'6' -> listOf('m', 'n', 'o')
'7' -> listOf('p', 'q', 'r', 's')
'8' -> listOf('t', 'u', 'v')
'9' -> listOf('w', 'x', 'y', 'z')
else -> listOf()
}
}


Пояснение:
Проверка пустого ввода: Если входная строка digits пуста, функция возвращает пустой список, так как нет цифр для обработки.

Формирование комбинаций:

Используется метод fold для последовательного обработки каждого символа строки digits. На начальном этапе в аккумулятор передается список, содержащий пустую строку.
Для каждого символа c в digits, получаются возможные буквы, соответствующие этому символу (c.letters).
Далее, для каждой буквы из возможных (letter), происходит объединение этой буквы со всеми строками в текущем аккумуляторе (acc), формируя новые строки. Результат каждого шага объединяется в список, что позволяет формировать все возможные комбинации.
Получение букв по цифре: Метод расширения letters для типа Char возвращает список букв, соответствующих данной цифре. Это позволяет быстро и удобно получить доступ к возможным буквам для каждой цифры в строке.
👍1