Решение: Merge двух отсортированных списков
1. Базовая реализация O(n+m)
fun mergeSortedLists(list1: List<Int>, list2: List<Int>): List<Int> {
val result = mutableListOf<Int>()
var i = 0
var j = 0
while (i < list1.size && j < list2.size) {
if (list1[i] <= list2[j]) {
result.add(list1[i])
i++
} else {
result.add(list2[j])
j++
}
}
while (i < list1.size) {
result.add(list1[i])
i++
}
while (j < list2.size) {
result.add(list2[j])
j++
}
return result
}
2. Обобщённая версия для Comparable типов
Решение: GitHub репозитории организации с пагинацией и поиском
Архитектура Clean Architecture + MVVM с Paging 3 и обработкой rate limiting
Приложение использует GitHub REST API, поддерживает пагинацию через Paging 3, обработку rate limiting и кэширование с помощью Room.
Структура проекта
Решение: Погодное приложение с управлением городами и настройками
Архитектура Clean Architecture + MVVM с DataStore и Navigation
Приложение предоставляет работу с погодой через OpenWeatherMap API, управление городами через DataStore и навигацию между экранами через Navigation Component.
Структура проекта
Решение: Поиск двух чисел с заданной суммой
Анализ задачи
Необходимо найти в массиве два элемента, сумма которых равна целевому значению. Вернуть их индексы или null, если пары нет. Каждый элемент используется только один раз.
Решение: Оптимальный алгоритм O(n) с HashMap
Лучший подход использует HashMap для решения в одну итерацию:
fun findTwoSum(nums: IntArray, target: Int): Pair<Int, Int>? {
val seen = mutableMapOf<Int, Int>() // value -> index
for (i in nums.indices) {
val complement = target - nums[i] // какое число нам нужно
// Если нужное число уже видели - нашли пару
if (seen.containsKey(complement)) {
return Pair(seen[complement]!!, i)
}
// Сохраняем текущий элемент в карту
seen[nums[i]] = i
}
return null // Пара не найдена
}
Как это работает
Пример 1: findTwoSum([2, 7, 11, 15], 9)
Решение: Приложение Recipes с поиском, сортировкой и кэшированием
Архитектура Clean Architecture + MVVM
Приложение разделено на три независимых слоя:
Структура проекта
Решение: Реализация Set на основе List
1. Базовая реализация MySet
class MySet<T> {
private val elements: MutableList<T> = mutableListOf()
fun count(): Int = elements.size
fun add(element: T): Boolean {
if (contains(element)) {
return false
}
elements.add(element)
return true
}
fun remove(element: T): Boolean {
return elements.remove(element)
}
fun contains(element: T): Boolean {
return elements.contains(element)
}
fun clear() {
elements.clear()
}
fun isEmpty(): Boolean = elements.isEmpty()
fun toList(): List<T> = elements.toList()
}
2. Реализация с итератором
Решение: Реализация RSS Reader приложения
Архитектура приложения
Я разработаю RSS Reader с архитектурой MVVM (Model-View-ViewModel), которая идеально подходит для этой задачи. Архитектура разделена на три слоя:
Структура проекта
Решение: Переворот строки по словам на Kotlin
Основное решение
fun reverseWords(input: String): String { if (input.isBlank()) { return "" } val words = input.trim().split("\s+".toRegex()) return words.asReversed().joinToString(" ") }
Анализ: O(n) по времени и O(n) по памяти. Разделяем на слова, переворачиваем список, объединяем обратно.
In-place решение для CharArray
fun reverseWordsInPlace(chars: CharArray): Int { reverse(chars, 0, chars.size) var start = 0 for (i in chars.indices) { if (i == chars.size - 1 || chars[i + 1] == ' ') { reverse(chars, start, i + 1) start = i + 2 } } return chars.size }
Сначала переворачиваем всю строку, затем каждое слово. O(n) время, O(1) память.
Unit тесты
Решение: Калькулятор с рекурсивным спуском
Реализовал парсер математических выражений методом рекурсивного спуска.
Tokenizer для лексического анализа
Разделяет входную строку на токены: числа, операторы, скобки.
ExpressionParser - Синтаксический анализ
Грамматика:
Приоритет операций:
Unit Tests (14 тестов)
Решение: Приложение расписания тренировок фитнес-клуба
Архитектура Clean Architecture + MVVM с кэшированием и уведомлениями
Приложение обеспечивает работу с расписанием тренировок, включая фильтрацию, сортировку, запись и уведомления.
Структура проекта
Решение: Менеджер паролей с шифрованием и биометрией
Архитектура Clean Architecture + MVVM с акцентом на безопасность
Приложение использует Android KeyStore для криптографии, EncryptedSharedPreferences для конфиденциальных данных и Room для хранения зашифрованных записей.
Структура проекта
Решение: Приложение для отображения ресторанов на карте
Архитектура Clean Architecture + MVVM
Приложение состоит из трёх слоёв с использованием Google Maps SDK и управлением состоянием через StateFlow.
Структура проекта