https://leetcode.com/problems/day-of-the-week/ Easy

Условие

Даны три целых числа: day, month, year. Нужно вернуть день недели в формате строки ("Sunday", "Monday", ..., "Saturday"). Гарантируется, что входные данные находятся в диапазоне 1971 ≤ year ≤ 2100.

Примеры

Input: day = 31, month = 8, year = 2019 Output: "Saturday”

Input: day = 18, month = 7, year = 1999 Output: "Sunday”

Input: day = 15, month = 8, year = 1993 Output: "Sunday”

Решение

fun dayOfTheWeek(day: Int, month: Int, year: Int): String {
		// Проверка на високосный год
		fun isLeapYear(year: Int): Boolean {
		    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
		}
		
    // Список дней недели, начиная с воскресенья
    val daysOfWeek = arrayOf("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")

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

    // Начальная точка — 1 января 1971 года (пятница)
    var totalDays = 4 // Индекс пятницы в daysOfWeek

    // Считаем количество дней с 1971 до (year-1)
    for (y in 1971 until year) {
        totalDays += if (isLeapYear(y)) 366 else 365
    }

    // Считаем дни с начала года до указанного месяца
    for (m in 1 until month) {
        totalDays += daysInMonth[m]
        // Добавляем 1 день, если текущий год високосный и месяц прошел февраль
        if (m == 2 && isLeapYear(year)) {
            totalDays += 1
        }
    }

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

    // Возвращаем день недели по индексу
    return daysOfWeek[totalDays % 7]
}

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

O(1), так как количество итераций ограничено фиксированным диапазоном лет.

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

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