Алгоритмы на Kotlin — часть 2

Сегодня на очереди вторая часть алгоритмов на Kotlin. Своими решениями не претендую на оригинальность, но вдруг кому-нибудь пригодится для собеседования. Первую часть статьи можно прочитать здесь.

Реверс массива в Kotlin

Первая задача на Kotlin — реверс массива. Конечно, в стандартной библиотеке уже есть такая функция, но мы сделаем по-своему.

inline fun <reified T> arrReverse(arr: Array<T>): Array<T?> {
    val result = arrayOfNulls<T>(arr.size)
    for (i in arr.indices) {
        result[i] = arr[arr.size-i-1]
    }
    return result
}

Функция arrReverse принимает на вход массив типа T, и возвращает аналогичный тип. Переменной rersult присваиваем пустой массив, установив ему размер нашего исходного массива. Далее, в цикле мы записываем в результирующий массив элементы исходного, начиная с конечного. Все просто.

В данном случае нужно использовать модификатор inline для метода и параметр вещественного типа (reified type parameter), который позволит нам получить доступ к Array во время исполнения и заполнить пустой массив параметром T. Подробнее об inline и reified можно прочесть в документации.

Количество букв в строке

Еще один пример простой задачи Kotlin. Нам нужно посчитать количество повторений букв или символов в строке и вывести число повторений рядом с каждым символом.

Пример. Имеется строка AAABBCOOLLWWW из которой на выходе нужно получить — A3B2C1O2L2W3. Приступим.

fun calcLetters(str: String): String {
    var char = str[0]
    var acc = 0
    var res = ""

    str.forEach { letter ->    // (1)
        if (char == letter) {
            acc++    // (2)
        } else { // (3)
            res += "$char$acc"
            acc = 1
            char = letter
        }
    }
    res += "$char$acc" // (4)
    return res
}

Теперь рассмотрим как это работает. Метод calcLetters принимает на вход строку. Далее мы берем из нее первый символ и записываем его в переменную char. Заводим еще 2 переменные — acc (количество повторений) и res (результирующая строка).

Проходимся по всем символам в строке (1) и если следующий символ равен предыдущему, то прибавляем 1 к нашему счетчику повторений acc (2). Если далее похожих символов нет, то выводим в строку наш символ и рядом с ним количество повторений, а в переменную char записываем новый символ (3).

Важный момент. Если не добавить тут (4) еще раз сложение строки, то алгоритм отработает нормально лишь до предпоследнего символа.

P.S.

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

Всем пока!

2 комментария

  1. блиин спасибо тебе большое!!! а то , хотя уже 2021 , вообще нету статей по Алгоритмам Котлин и очень тяжело мне было , благодаря тебе , все потихоньку проясняеться

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

Оставить ответ