Count a Character
Bir s dizgesi ve tek bir c harfi verilir. c harfinin s içinde kaç kez geçtiğini döndürün. Eşleşme büyük-küçük harfe duyarlıdır: B ve b farklı karakterlerdir.
Fonksiyon
- sstring
- aranacak İngilizce harf dizisi
- cstring
- sayılacak tek harf
- Döndürürinteger
- s dizgesinin kaç karakteri c'ye eşittir
Kısıtlar
1 ≤ s.length ≤ 5 × 104syalnızca İngilizce harfler (ailezarası,AileZarası) içerir.ctam olarak bir İngilizce harftir.
Örnekler
- Girdi
- s = "Mississippi"c = "s"
- Çıktı
- 4
- Açıklama
Mississippisözcüğünde 2, 3, 5 ve 6 indekslerindesbulunur, bu yüzden cevap 4'tür.
- Girdi
- s = "Banana"c = "b"
- Çıktı
- 0
- Açıklama
BananabüyükBharfiyle başlıyor ve sen küçükbharfini arıyorsun. Hiçbir eşleşme yok, bu yüzden yanıt 0.
Ek soru
c, ss gibi birkaç harften oluşan bir sözcük olsaydı ne olurdu? Örtüşen eşleşmeler sayılır mı ve döngünüz nasıl değişir?
İpuçları
Tek tek açın. Her biri biraz daha fazlasını gösterir.
ckarakterinin kaç kez geçtiğini bilmek içinsiçindeki hangi karakterlere bakmanız gerekir?s'nin her karakterinicile olduğu gibi karşılaştır. Burada büyük ve küçük harfler farklı karakterlerdir.0'dan başlayan bir sayaç tut. Dizenin üzerinden bir kez geç ve geçerli karakter
c'ye eşit olduğunda 1 ekle.
Çözüm
s'nin herhangi bir karakteri c olabilir, bu yüzden her birine bir kez bakıp eşleşmeleri sayarsın. Büyük-küçük harf duyarlılığına dikkat et: büyük harf farklı bir karakterdir.
Her c karakterini sil ve uzunlukları karşılaştır
Sezgi
Her c karakteri çıkararak s dizisinin bir kopyasını oluştur. Her çıkarma, kopyayı bir karakter kısaltır; dolayısıyla uzunluk farkı sayıdır. Mississippi için kopya Miiippi olur: 11 eksi 7, 4 eder.
Zaman karmaşıklığı O(n)'dir, ancak kopya, bir sayacın ihtiyaç duymadığı O(n) ek bellek kullanır.
Algoritma
cdeğerine eşit olan her karakteri dışarıda bırakanskopyasını oluştur.suzunluğunu ve kopyanın uzunluğunu ölç.suzunluğundan kopyanın uzunluğunu çıkarıp sonucu döndür.
def countChar(s, c):
# Every c that disappears makes the string one character shorter.
without = s.replace(c, "")
return len(s) - len(without)Sayaçla tek geçiş
Sezgi
Kopyasını oluşturmak yerine okurken say. Bir sayaç 0'dan başlar ve c'ye eşit olan her karakter için 1 artar. Basit eşitlik, büyük harflerin küçük harflerle eşleşmesini önler.
Her karakter yalnızca bir kez karşılaştırılır ve yalnızca sayaç saklanır: O(n) zaman, O(1) alan. Hiçbir çözüm O(n) zamandan daha iyisini yapamaz; çünkü atladığın bir karakter bir c daha olabilir.
Algoritma
- Hedef harfi
c'den oku vecount = 0olarak ayarla. süzerinde her seferinde bir karakter ilerle.- Karakter hedef harfe eşitse
count'a 1 ekle. count'u döndür.
def countChar(s, c):
count = 0
for ch in s:
if ch == c:
count += 1
return count
Tuzaklar ve uç durumlar
- Büyük/küçük harf duyarlılığını yok saymak. Her iki tarafı da küçük harfe çevirmek,
Bananailebiçin 1 döndürür; doğru yanıt 0'dır. - Bir karakteri bir dizgeyle karşılaştırmak. Java, C, C++, C# ve Go'da
cbir dizge olarak gelirkens[i]veyas.charAt(i)tek bir karakterdir. Döngüden önce bir kezc[0](veyac.charAt(0)) alın. - Java'da dizgeleri
==ile karşılaştırmak.String.valueOf(s.charAt(i)) == cnesne kimliğini karşılaştırır ve neredeyse her zaman false sonucunu verir.chardeğerlerini karşılaştırın. - C'de döngü koşulunda
strlen(s)çağırmak. Bu, dizgeyi her adımda yeniden tarar; dolayısıyla5 × 10^4karakter yaklaşık2.5 × 10^9adıma mal olur.
Sıkça sorulan sorular3
Bir dizgedeki bir karakterin kaç kez geçtiğini nasıl sayarsın?
Dizgeyi 0'dan başlayan bir sayaçla bir kez dolaşın ve geçerli karakter aradığınız karaktere her eşit olduğunda sayaca 1 ekleyin. Bu işlem O(n) zaman ve O(1) ek bellek gerektirir. Büyük/küçük harfe duyarsız bir sayım için önce hem dizgeyi hem de harfi küçük harfe dönüştürün.
Bir mülakatta yerleşik bir count fonksiyonunu kullanabilir miyim?
Genellikle evet, maliyetini açıklayabildiğin sürece. Python'ın str.count ve benzeri işlevleri yine de dizenin tamamını okur, bu yüzden O(n) karmaşıklığındadır. Görüşmeci isterse döngüyü yazmaya hazır ol.
Her karakteri bir kerede nasıl sayardın?
Tek bir geçiş yapın ve her karakterin sayısını bir hash map'te veya İngilizce harfler için 52 sayaçtan oluşan bir dizide tutun. Bu geçişten sonra herhangi bir harfin sayısını tek bir aramayla bulabilirsiniz. Aynı dizgedeki birçok harf hakkında soru sorulduğunda bunu kullanın.
Benzer problemler
Aynı fikirleri kullanan problemler. İki üçünü çözmek bir kalıbı kalıcı hale getirir.
def countChar(s, c):
# Kodu buraya yazınTest #1
Test #2
Argümanlar
s = "Mississippi" c = "s"
Beklenen Çıktı
4