Count Even Numbers
Boş olmayan bir tam sayı listesi olan nums verildiğinde, değerlerinden kaçının çift olduğunu döndür. Bir sayı, 2'ye 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ın 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ür;3ve5bölünmez. Cevap3.
- 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 hepsi tektir, bu yüzden cevap0.
Ek soru
Şu soruyla sık sık karşılaşırsın: l indeksi ile r indeksi arasında kaç tane çift değer var? nums üzerinde tek 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?xdeğeri, ancak ve ancakx % 20ise çifttir. Dikkat: negatif tek bir sayı için bazı diller kalan olarak1değil,-1verir.Sayacı
0olarak başlat, her değeri bir kez oku ve2ile bölümünden kalan0olduğunda1ekle.
Çözüm
Her değeri bir kez kontrol edin ve 2'ye bölündüğünde kalanı 0 olanları sayın. Tek olup olmadığını 1 ile test etmek yerine kalanı 0 ile karşılaştırmak, negatif sayılarda da doğru sonucu verir.
Çift değerleri topla, ardından onları say
Sezgi
Çift değerleri filtreyle seç, ardından sonucun uzunluğunu döndür. [3, 8, 12, 5, 6] için filtrelenmiş liste [8, 12, 6] olur; dolayısıyla cevap 3'tür.
Zaman karmaşıklığı O(n)'dir, ancak yeni liste, uzunluğunu yalnızca bir kez okumak için en fazla 5000 değerlik bellek kullanır.
Algoritma
numsiçindex % 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 yerine bir sayaç tutun ve x % 2 == 0 koşulunu sağlayan her değer için 1 ekleyin. Bir çift sayı, işareti ne olursa olsun 0 kalanını verir; bu nedenle bu koşul her dilde -4 ve 0 için sağlanır. x % 2 == 1 şeklinde yazılan tek sayı koşulu ise bunu yapmaz: C, Java, JavaScript ve C benzeri dillerin çoğunda kalan, sayının işaretini alır; bu nedenle -3 % 2 sonucu -1 olur.
Tek geçiş ve tek tamsayı: O(n) zaman, O(1) alan.
Algoritma
countdeğerini0olarak ayarla.numsiçindeki herxdeğeri üzerinde döngü oluştur.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
- Tek değerleri
x % 2 == 1ile sayıp uzunluktan çıkarmak. C benzeri dillerde-3 % 2sonucu-1olur; bu nedenle[-3], 0 yerine 1 döndürür. 0değerini ne çift ne de tek olarak değerlendirmek.0 = 2 × 0olduğundan[0],1döndürür.- Bit testini
x & 1 == 0şeklinde yazmak. C, C++ ve JavaScript'te==,&işleminden daha sıkı bağlanır; dolayısıyla bu ifadex & (1 == 0)anlamına gelir ve sonucu her zaman0olduğundan hiçbir şeyi saymaz.(x & 1) == 0şeklinde yazın.
Sıkça sorulan sorular3
Kodda bir sayının çift olup olmadığını nasıl kontrol edersin?
Bölme işleminden sonra kalanının sıfır olup olmadığını test edin: x % 2 == 0. -3 % 2 işleminin -1 olduğu dillerde bile pozitif sayılar, negatif sayılar ve sıfır için çalışır. En düşük biti (x & 1) == 0 ile de kontrol edebilirsiniz.
Sıfır çift sayı mıdır?
Evet. Sıfırın 2'ye bölümü kalansız 0 olduğundan, çift sayı tanımına uyar. Ayrıca, çift sayıların yer aldığı tek sayılar -1 ve 1 arasındadır.
Dizideki çift sayıların sayılmasının zaman karmaşıklığı nedir?
Sayaçla yapılan tek bir 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.
Benzer problemler
Aynı fikirleri kullanan problemler. İki üçünü çözmek bir kalıbı kalıcı hale getirir.
def countEvens(nums):
# Kodu buraya yazınTest #1
Test #2
Test #3
Argüman
nums = [3, 8, 12, 5, 6]
Beklenen Çıktı
3