Leap Year
Kamu mendapatkan sebuah tahun year dalam kalender Gregorian. Kembalikan true jika tahun tersebut adalah tahun kabisat, yaitu tahun yang memiliki tanggal 29 Februari, dan false jika tidak.
Sebuah tahun adalah tahun kabisat jika habis dibagi 4, kecuali tahun yang habis dibagi 100, yang bukan tahun kabisat kecuali juga habis dibagi 400.
Fungsi
- yearinteger
- tahun yang akan diperiksa
- Mengembalikanboolean
- benar jika tahun memiliki tanggal 29 Februari, salah jika tidak
Batasan
1 ≤ year ≤ 106
Contoh
- Input
- year = 2024
- Output
- true
- Penjelasan
2024habis dibagi4dan bukan tahun abad, jadi ini adalah tahun kabisat.
- Input
- year = 1900
- Output
- false
- Penjelasan
1900habis dibagi4, tetapi juga habis dibagi100dan tidak habis dibagi400, jadi pengecualian abad berlaku: bukan tahun kabisat.
- Input
- year = 2000
- Output
- true
- Penjelasan
2000habis dibagi100, yang berarti tahun ini tidak memenuhi syarat, tetapi juga habis dibagi400, sehingga memenuhi syarat lagi. Ini adalah tahun kabisat.
Petunjuk
Buka satu per satu. Setiap petunjuk mengungkap sedikit lebih banyak.
Sisa
0setelah dibagi4adalah aturan pertama. Tahun mana yang melanggarnya?Tahun abad tidak mengikuti aturan itu, dan kelipatan
400pada gilirannya mengecualikan aturan abad. Setiap kelipatan400juga merupakan kelipatan100dan4, jadi urutan pemeriksaanmu menentukan jawabannya.Periksa keterbagian dengan
400terlebih dahulu, lalu dengan100, kemudian dengan4, dan biarkan aturan pertama yang cocok menentukan hasilnya. Atau gabungkan: habis dibagi 4 dan tidak habis dibagi 100, atau habis dibagi 400.
Solusi
Setiap aturan membutuhkan satu sisa, jadi pekerjaan ini terdiri dari tiga pemeriksaan keterbagian. Jebakannya ada pada urutan: pada 2000, abad yang juga merupakan kelipatan 400, aturan-aturan itu bertentangan. Uji aturan yang paling spesifik terlebih dahulu, atau tulis satu ekspresi dengan tanda kurung yang mempertahankan pengecualiannya.
Periksa aturan dari yang paling spesifik hingga yang paling umum
Intuisi
Tahun yang habis dibagi 4 adalah tahun kabisat, yang habis dibagi 100 membatalkan aturan itu, dan yang habis dibagi 400 membatalkan pembatalan tersebut. Setiap kelipatan 400 juga merupakan kelipatan 100, dan setiap kelipatan 100 juga merupakan kelipatan 4, jadi aturan paling spesifik yang cocok menentukan jawabannya.
Uji 400, lalu 100, lalu 4, dan kembalikan hasil pada kecocokan pertama. 2000 berhenti pada pengujian pertama, 1900 pada pengujian kedua, dan 2024 pada pengujian ketiga. Tahun yang tidak cocok dengan satu pun berarti tidak habis dibagi 4, jadi merupakan tahun biasa.
Algoritma
- Jika
year % 400 == 0, kembalikantrue. - Jika
year % 100 == 0, kembalikanfalse. - Jika
year % 4 == 0, kembalikantrue. - Jika tidak, kembalikan
false.
def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
return FalseSatu ekspresi boolean
Intuisi
Baca aturan ini sebagai dua cara untuk menjadi tahun kabisat: habis dibagi 4 dan bukan tahun abad, atau habis dibagi 400. Kalimat itu menjadi (year % 4 == 0 and year % 100 != 0) or year % 400 == 0.
2024 memenuhi bagian pertama. 1900 dan 2000 sama-sama gagal memenuhi bagian itu karena merupakan tahun abad; hanya 2000 yang memenuhi bagian kedua, karena 1900 % 400 adalah 300. Mengelompokkannya sebagai habis dibagi 4 dan (bukan tahun abad atau kelipatan 400) memberikan hasil yang sama untuk setiap tahun.
Algoritma
- Hitung
year % 4 == 0 and year % 100 != 0: habis dibagi 4 dan bukan tahun abad. - Hitung
year % 400 == 0. - Kembalikan
truejika salah satu bagian terpenuhi.
def isLeapYear(year):
# Every 4th year, except centuries, except every 400th year.
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
Jebakan dan kasus tepi
- Hanya memeriksa
year % 4 == 0. Ini benar untuk setiap tahun dari1901hingga2099, sehingga bug ini tersembunyi, dan salah untuk1900dan2100. - Menguji
100sebelum400dalam rangkaian if. Pemeriksaan abad menghasilkanfalseuntuk2000sebelum pengujian400dijalankan. - Menghilangkan bagian yang memeriksa apakah tahun habis dibagi 4.
year % 100 != 0 or year % 400 == 0menganggap2023sebagai tahun kabisat karena2023bukan tahun abad. - Menggunakan
year / 4padahal yang kamu maksud adalah sisa bagi. Pembagian memberi tahu berapa kali4dapat masuk, sedangkan sisa bagi memberi tahu apakah pembagian itu tepat.
Pertanyaan yang sering diajukan3
Berapa kompleksitas waktu untuk memeriksa tahun kabisat?
O(1) dalam waktu dan ruang: paling banyak tiga operasi sisa bagi dan beberapa perbandingan, tahun berapa pun.
Mengapa 1900 bukan tahun kabisat, tetapi 2000 adalah tahun kabisat?
Keduanya adalah tahun abad, yang habis dibagi 100, sehingga biasanya tahun tersebut tidak termasuk. 2000 juga habis dibagi 400, dan aturan itu mengesampingkan aturan tahun abad. 1900 menyisakan 300 saat dibagi 400, jadi tetap merupakan tahun biasa.
Mengapa aturan abad ada?
Satu tahun matahari berlangsung sekitar 365.2422 hari. Penambahan satu hari kabisat setiap 4 tahun menghasilkan rata-rata 365.25, sekitar 3 hari terlalu banyak setiap 400 tahun. Dengan melewatkan hari kabisat pada 3 dari setiap 4 tahun abad, kelebihan hari itu dihilangkan dan rata-ratanya menjadi 365.2425, sehingga kalender tetap selaras dengan musim.
Soal serupa
Soal yang memakai ide yang sama. Mengerjakan dua atau tiga di antaranya membuat polanya melekat.
def isLeapYear(year):
# Tulis kodemu di siniTes #1
Tes #2
Tes #3
Argumen
year = 2024
Output yang diharapkan
true