Count Even Numbers
Diberikan list bilangan bulat nums yang tidak kosong, kembalikan jumlah nilainya yang genap. Bilangan disebut genap jika membaginya dengan 2 tidak menyisakan sisa, termasuk 0 dan bilangan negatif seperti -4.
Fungsi
- numsinteger-array
- daftar bilangan bulat yang akan diperiksa
- Mengembalikaninteger
- jumlah nilai genap dalam nums
Batasan
1 ≤ nums.length ≤ 5000-109 ≤ nums[i] ≤ 109
Contoh
- Input
- nums = [3, 8, 12, 5, 6]
- Output
- 3
- Penjelasan
8,12, dan6dapat dibagi2tanpa sisa;3dan5tidak. Jawabannya adalah3.
- Input
- nums = [-4, -3, 0, 7]
- Output
- 2
- Penjelasan
-4 = 2 × (-2)dan0 = 2 × 0, jadi keduanya genap.-3dan7ganjil, dan jumlahnya2.
- Input
- nums = [1, 9, 15]
- Output
- 0
- Penjelasan
1,9, dan15semuanya ganjil, jadi jawabannya adalah0.
Pertanyaan lanjutan
Kamu mendapat banyak pertanyaan: berapa banyak nilai genap yang berada di antara indeks l dan indeks r? Setelah satu kali melewati nums, bisakah kamu menjawab setiap pertanyaan dalam waktu O(1)?
Petunjuk
Buka satu per satu. Setiap petunjuk mengungkap sedikit lebih banyak.
Apa sisa pembagian bilangan genap dengan
2?Nilai
xadalah genap tepat ketikax % 2bernilai0. Hati-hati: untuk bilangan ganjil negatif, beberapa bahasa menghasilkan-1sebagai sisa, bukan1.Mulai penghitung dari
0, baca setiap nilai satu kali, dan tambahkan1setiap kali sisa pembagian dengan2adalah0.
Solusi
Periksa setiap nilai satu kali dan hitung nilai yang bersisa 0 saat dibagi 2. Membandingkan sisa dengan 0, bukan memeriksa apakah bilangan ganjil dengan 1, memastikan bilangan negatif ditangani dengan benar.
Kumpulkan nilai genap, lalu hitung jumlahnya
Intuisi
Pilih nilai genap dengan filter, lalu kembalikan panjang hasilnya. Untuk [3, 8, 12, 5, 6], list yang difilter adalah [8, 12, 6], jadi jawabannya 3.
Waktunya O(n), tetapi list baru memerlukan memori O(n), hingga 5000 nilai, hanya untuk membaca panjangnya sekali.
Algoritma
- Buat list baru yang berisi setiap
xdi dalamnumsdenganx % 2 == 0. - Kembalikan panjang list tersebut.
def countEvens(nums):
evens = [x for x in nums if x % 2 == 0]
return len(evens)Hitung dengan penghitung yang terus bertambah
Intuisi
Gunakan pencacah alih-alih list, lalu tambahkan 1 untuk setiap nilai dengan x % 2 == 0. Bilangan genap memiliki sisa 0 apa pun tandanya, jadi pengujian ini berlaku untuk -4 dan 0 dalam semua bahasa. Pengujian untuk bilangan ganjil yang ditulis x % 2 == 1 tidak berlaku: dalam C, Java, JavaScript, dan sebagian besar bahasa mirip C, sisa mengikuti tanda bilangan, jadi -3 % 2 adalah -1.
Satu kali lintasan dan satu bilangan bulat: waktu O(n), ruang O(1).
Algoritma
- Atur
countke0. - Lakukan perulangan untuk setiap nilai
xdinums. - Jika
x % 2 == 0, tambahkan1kecount. - Setelah perulangan, kembalikan
count.
def countEvens(nums):
count = 0
for x in nums:
if x % 2 == 0: # 0 also works for negatives, where the remainder can be -1
count += 1
return count
Jebakan dan kasus tepi
- Menghitung nilai ganjil dengan
x % 2 == 1, lalu mengurangkannya dari panjangnya. Dalam bahasa mirip C,-3 % 2adalah-1, jadi[-3]menghasilkan 1, bukan 0. - Menganggap
0bukan bilangan genap maupun ganjil.0 = 2 × 0, jadi[0]menghasilkan1. - Menulis pengujian bit sebagai
x & 1 == 0. Dalam C, C++ dan JavaScript,==memiliki prioritas lebih tinggi daripada&, jadi ekspresi itu berartix & (1 == 0), yang selalu bernilai0dan tidak menghitung apa pun. Tulis(x & 1) == 0.
Pertanyaan yang sering diajukan3
Bagaimana cara memeriksa apakah sebuah angka genap dalam kode?
Uji apakah sisa setelah dibagi dengan 2 adalah nol: x % 2 == 0. Cara ini berfungsi untuk bilangan positif, bilangan negatif, dan nol, bahkan dalam bahasa yang menghasilkan -1 untuk -3 % 2. Kamu juga bisa memeriksa bit paling rendah dengan (x & 1) == 0.
Apakah nol termasuk bilangan genap?
Ya. Nol dibagi 2 hasilnya 0 tanpa sisa, jadi memenuhi definisi bilangan genap. Bilangan itu juga berada di antara bilangan ganjil -1 dan 1, tempat bilangan genap berada.
Berapa kompleksitas waktu untuk menghitung bilangan genap dalam sebuah array?
Satu kali lintasan dengan pencacah membutuhkan waktu O(n) dan ruang tambahan O(1). Setiap nilai harus diperiksa, jadi tidak ada cara yang lebih cepat daripada O(n).
Soal serupa
Soal yang memakai ide yang sama. Mengerjakan dua atau tiga di antaranya membuat polanya melekat.
def countEvens(nums):
# Tulis kodemu di siniTes #1
Tes #2
Tes #3
Argumen
nums = [3, 8, 12, 5, 6]
Output yang diharapkan
3