Cho ngày theo định dạng "YYYY-MM-DD". Trả về thứ tự ngày trong năm (1-366). Ví dụ: "2019-02-10" → 41 (ngày thứ 41 của năm 2019).
Thuật toán
- Mảng ngày tích lũy mỗi tháng:
[0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334](năm thường) - Parse year, month, day từ chuỗi
- Kiểm tra năm nhuận:
year % 400 == 0hoặc(year % 4 == 0 and year % 100 != 0) - Nếu năm nhuận và tháng > 2: cộng thêm 1
- Kết quả =
days[month-1] + day
Ví dụ (Python)
class Solution(object):
def dayOfYear(self, date):
# Ngày tích lũy cuối mỗi tháng (năm thường)
days = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
year, month, day = map(int, date.split('-'))
# Kiểm tra năm nhuận
is_leap = (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0)
result = days[month - 1] + day
if is_leap and month > 2:
result += 1
return result
ob1 = Solution()
print(ob1.dayOfYear("2019-02-10")) # 41
print(ob1.dayOfYear("2020-03-01")) # 61 (2020 là năm nhuận)
Cách dùng thư viện chuẩn (Khuyên dùng)
from datetime import datetime
def dayOfYear(date):
dt = datetime.strptime(date, "%Y-%m-%d")
return dt.timetuple().tm_yday
print(dayOfYear("2019-02-10")) # 41
print(dayOfYear("2020-03-01")) # 61
Độ phức tạp
- Thời gian:
O(1) - Không gian:
O(1)
Đầu vào / Đầu ra
Input: "2019-02-10" Output: 41