Count Even Numbers
Boş olmayan bir tam sayı listesi olan nums veriliyor. Değerlerinden kaç tanesinin çift olduğunu döndürün. Bir sayı, 2 ile bölündüğünde kalan bırakmıyorsa çifttir; buna 0 ve -4 gibi negatif sayılar da dahildir.
Fonksiyon
- numsinteger-array
- kontrol edilecek tam sayılar listesi
- Döndürürinteger
- nums içindeki çift değerlerin sayısı
Kısıtlar
1 ≤ nums.length ≤ 5000-109 ≤ nums[i] ≤ 109
Örnekler
- Girdi
- nums = [3, 8, 12, 5, 6]
- Çıktı
- 3
- Açıklama
8,12ve6,2'ye kalansız bölünürken3ve5kalan bırakır. Bu da 3 değerin çift olduğu anlamına gelir.
- Girdi
- nums = [-4, -3, 0, 7]
- Çıktı
- 2
- Açıklama
-4 = 2 × (-2)ve0 = 2 × 0, dolayısıyla ikisi de çifttir.-3ve7tektir ve sayı2'dir.
- Girdi
- nums = [1, 9, 15]
- Çıktı
- 0
- Açıklama
1,9ve15sayıların tümü tektir, bu yüzden hiçbir değer sayılmaz ve cevap0'dır.
Gönderirken +12 gizli test
Ek soru
Şu biçimde birçok soru alıyorsun: l dizini ile r dizini arasında kaç çift değer bulunuyor? nums üzerinde bir geçiş yaptıktan sonra her soruyu O(1) zamanda yanıtlayabilir misin?
İpuçları
Tek tek açın. Her biri biraz daha fazlasını gösterir.
Çift bir sayıyı
2'ye böldüğünde geriye ne kalır?Bir
xdeğeri,x % 2sonucu0olduğunda çifttir. Dikkat: bazı diller negatif tek sayılarda kalan olarak1değil,-1verir.0değerinden bir sayaç başlat, her değeri bir kez oku ve2ile bölümünden kalan0olduğunda1ekle.
Çözüm
Döngü tek satırdır; çözümlerin bozulduğu yer çiftlik testidir. Birçok dilde negatif bir sayının kalanı negatiftir, bu yüzden -3 % 2 sonucu -1 olur. x % 2 == 0 testini kullanmak, her dilde her işaret için doğrudur ve artan bir sayaç ek bellek gerektirmez.
Çift değerleri topla, ardından onları say
Sezgi
Görevi iki adıma böl: çift değerleri seç, sonra seçtiklerini say. x değeri, x % 2 == 0 olduğunda çifttir. Çoğu dilde yeni listeyi tek satırda oluşturan bir filtreleme işlevi vardır ve bu listenin uzunluğu yanıttır. [3, 8, 12, 5, 6] için filtrelenmiş liste [8, 12, 6] olur; dolayısıyla yanıt 3 olur.
Bu doğrudur ve okunması kolaydır, ancak yeni liste O(n) bellek kullanır; burada en fazla 5000 değer için, yalnızca uzunluğunu bir kez okumak amacıyla. Değerlerin kendileri bir daha kullanılmaz.
Algoritma
numsiçindekix % 2 == 0koşulunu sağlayan herx'i içeren yeni bir liste oluştur.- Bu listenin uzunluğunu döndür.
def countEvens(nums):
evens = [x for x in nums if x % 2 == 0]
return len(evens)Artan bir sayaçla say
Sezgi
Liste tutmak yerine bir sayaç kullan. Sayacı 0 ile başlat, her değere bir kez bak ve değer çiftse 1 ekle. Her değer tam olarak bir kez kontrol edildiği için sayı kesin olur ve kullanılan tek bellek bir tamsayıdır.
Testi dikkatli yapmak gerekir. C, C++, Java, C#, JavaScript, Go, Rust, Swift ve PHP'de kalan sayının işaretini alır; bu nedenle -3 % 2 sonucu 1 değil, -1 olur. Çift sayılar işaretleri ne olursa olsun 0 kalanını verir; dolayısıyla x % 2 == 0 her zaman doğrudur, oysa x % 2 == 1 şeklinde yazılan tek sayı testi negatif tek sayıların tümünü kaçırır. [-4, -3, 0, 7] için kalanlar sırasıyla 0, -1, 0 ve 1 olur; bu nedenle sayaç 2 değerine ulaşır.
Sıfır da sayılır: 0 % 2 sonucu 0 olduğundan 0 çifttir.
Algoritma
countdeğerini0olarak ayarla.numsiçindeki herxdeğeri üzerinde döngü yap.x % 2 == 0isecountdeğerine1ekle.- Döngüden sonra
countdeğerini döndür.
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
Tuzaklar ve uç durumlar
Buradaki hatalar negatif sayılardan ve sıfırdan kaynaklanıyor.
- Tek değerleri
x % 2 == 1ile sayıp uzunluktan çıkarmak. C benzeri dillerde-3 % 2sonucu-1olur; bu nedenle-3hiçbir zaman tek olarak sayılmaz ve çift olarak sayılır. 0değerini ne çift ne de tek kabul etmek.0 = 2 × 0, dolayısıyla çift sayıdır ve[0]sonucu1olur.- Bit testini
x & 1 == 0şeklinde yazmak. C, C++ ve JavaScript'te==,&işlecinden daha yüksek önceliğe sahiptir; bu nedenle ifadex & (1 == 0)anlamına gelir, bu da her zaman0sonucunu verir ve hiçbir şeyi saymaz.(x & 1) == 0şeklinde yazın. - Dizini 0 tabanlı bir dilde döngüyü
1dizininden başlatmak, ilk değerin atlanmasına neden olur; ya da ilk değerin1dizininde bulunduğu Lua ve R'de0dizininden başlatmak.
Sıkça sorulan sorular4
Kodda bir sayının çift olup olmadığını nasıl kontrol edersiniz?
2’ye bölündükten sonra kalanın sıfır olup olmadığını test et: x % 2 == 0. Bu, tüm yaygın dillerde pozitif sayılar, negatif sayılar ve sıfır için çalışır. Başka bir yol, çift sayıların 0 bitiyle bittiği için en düşük biti (x & 1) == 0 ile kontrol etmektir.
Sıfır çift sayı mıdır?
Evet. Sıfırın 2'ye bölümü, kalan olmadan 0 eder; bu nedenle çift sayının tanımına uyar. Ayrıca tek sayılar olan -1 ile 1 arasında, tam da bir çift sayının olması gereken yerde bulunur.
Negatif sayılar için x % 2 == 1 neden başarısız oluyor?
C, C++, Java, C#, JavaScript, Go, Rust, Swift ve PHP'de kalan, bölünen sayının işaretini alır; bu nedenle -3 % 2 sonucu -1 olur. Python, Ruby, Dart, Lua ve R ise bunun yerine 1 döndürür. Tek sayılar için x % 2 != 0, çift sayılar için x % 2 == 0 koşulunu sınamak hepsinde aynı sonucu verir.
Bir dizideki çift sayıların sayısını bulmanın zaman karmaşıklığı nedir?
Bir sayaçla tek geçiş O(n) zaman ve O(1) ek alan alır. Her değerin kontrol edilmesi gerekir; bu nedenle hiçbir yöntem O(n)’den daha hızlı değildir. Önce filtrelenmiş bir liste oluşturmak aynı sayıyı verir, ancak O(n) ek bellek kullanır.
Benzer problemler
Aynı fikirleri kullanan problemler. İki üçünü çözmek bir kalıbı kalıcı hale getirir.
Python
def countEvens(nums):
# Kodu buraya yazınDurum 1
Durum 2
Durum 3
Girdi
nums = [3, 8, 12, 5, 6]
Beklenen
3