https://leetcode.com/problems/number-of-days-between-two-dates/description/ Easy

Условие

Даны две строки date1 и date2 в формате "YYYY-MM-DD", представляющие две даты.

Верни абсолютную разницу в количестве дней между этими датами.

Примеры

Input: date1 = "2020-01-15", date2 = "2019-12-31” Output: 15

Input: date1 = "2020-01-01", date2 = "2020-01-02” Output: 1

Решение

fun daysBetweenDates(date1: String, date2: String): Int {
    // Функция для проверки високосного года
    fun isLeap(year: Int): Boolean {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
    }

    // Количество дней в каждом месяце
    val daysInMonth = intArrayOf(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

    // Функция для подсчёта дней с начала эпохи до заданной даты
    fun countDays(date: String): Int {
        val parts = date.split("-").map(String::toInt)
        val year = parts[0]
        val month = parts[1]
        val day = parts[2]

        var days = 0

        // Суммируем дни за полные года
        for (y in 1971 until year) {
            days += if (isLeap(y)) 366 else 365
        }

        // Суммируем дни за полные месяцы текущего года
        for (m in 1 until month) {
            days += if (m == 2 && isLeap(year)) 29 else daysInMonth[m - 1]
        }

        // Добавляем дни текущего месяца
        days += day

        return days
    }

    // Возвращаем абсолютную разницу между двумя датами
    return kotlin.math.abs(countDays(date1) - countDays(date2))
}

Временная сложность

O(y), где y — разница в годах между 1971 и max(date1, date2), так как проходит цикл по годам.

Пространственная сложность

O(1), используется фиксированное количество памяти.