https://leetcode.com/problems/day-of-the-week/ | Easy |
---|
Даны три целых числа: day
, month
, year
. Нужно вернуть день недели в формате строки ("Sunday"
, "Monday"
, ..., "Saturday"
). Гарантируется, что входные данные находятся в диапазоне 1971 ≤ year
≤ 2100.
Input:
day = 31, month = 8, year = 2019Output:
"Saturday”
Input:
day = 18, month = 7, year = 1999Output:
"Sunday”
Input:
day = 15, month = 8, year = 1993Output:
"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), так как используется только несколько переменных и массивов фиксированного размера.