FizzBuzz
Sayma oyunu FizzBuzz'da oyuncular 1'den başlayarak sayar ve bazı sayıları sözcüklerle değiştirir. Bir tur numarası n verildiğinde, oyuncunun o turda ne söyleyeceğini döndür: "FizzBuzz", n hem 3'e hem de 5'e bölünüyorsa; "Fizz", yalnızca 3'e bölünüyorsa; "Buzz", yalnızca 5'e bölünüyorsa; aksi hâlde "7" gibi, n değerinin kendisini bir dizge olarak.
Fonksiyon
- ninteger
- tur numarası, pozitif bir tam sayı
- Döndürürstring
- n. turda söylenen sözcük veya sayı, bir dize olarak
Kısıtlar
1 ≤ n ≤ 109- Yanıt, sayının kendisi olsa bile her zaman bir dizgedir.
Örnekler
- Girdi
- n = 15
- Çıktı
- "FizzBuzz"
- Açıklama
- 15'in 3'e bölümü 5'tir ve 15'in 5'e bölümü 3'tür; ikisinde de kalan olmadığından 15. tur
"FizzBuzz"olur.
- Girdi
- n = 7
- Çıktı
- "7"
- Açıklama
- 7, 3'e bölündüğünde 1, 5'e bölündüğünde 2 kalanını verir; bu nedenle hiçbir sözcük uygun değildir ve sayıyı metin olarak,
"7"şeklinde döndürürsün.
Ek soru
Yeni bir kural, 7'nin katlarını "Bazz" yapıyor; sözcükler sırayla birleştiriliyor, bu yüzden 105 için sonuç "FizzBuzzBazz" oluyor. Her birleşim için ayrı bir durum yazmadan bunu nasıl eklersin?
İpuçları
Tek tek açın. Her biri biraz daha fazlasını gösterir.
Kalan operatörü, bir sayının diğerini bölüp bölmediğini söyler:
n, yalnızcansayısının 3'e bölümünden kalan 0 olduğunda 3'e tam bölünür.15'i düşün. 3'e ve 5'e bölünebilir. 15'in
"FizzBuzz"alması,"Fizz"almaması için kontrollerinden hangisi önce çalışmalı?Önce 15'e, sonra 3'e, ardından 5'e bölünebilirliği test et. Hiçbiri eşleşmezse sayıyı bir dizgeye dönüştür. Dönüştürmenin her basamağı yazdığından emin ol; böylece 10^9, bilimsel gösterim yerine
"1000000000"olarak çıkar.
Çözüm
Her kural bir kalan kontrolüdür. Tuzak sıralamadadır: 15, 3'e bölünebildiğinden, önce 3'ü kontrol edip hemen sonuç döndüren bir işlev 15 için "Fizz" yanıtını verir. Ya önce birleşik durumu kontrol edin ya da yanıtı her iki kontrolden oluşturun.
Kelimeyi her iki kontrolden oluşturun
Sezgi
Boş bir sözcükle başla. 3, n'yi bölüyorsa "Fizz" ekle; 5, n'yi bölüyorsa "Buzz" ekle. Her iki kontrol de her zaman çalışır; bu nedenle 15'in katı olan sayılar her iki parçayı da sırayla alır ve özel bir durum olmadan "FizzBuzz" olur. Sözcük hâlâ boşsa hiçbir kural uygulanmamıştır ve sayıyı dize olarak döndürürsün.
Algoritma
word'ü boş bir dizge olarak ayarla.n % 3 == 0ise"Fizz"ekle.n % 5 == 0ise"Buzz"ekle.wordboşsa,n'yi bir dizgeye dönüştürüp döndür.- Aksi takdirde
word'ü döndür.
def fizzBuzz(n):
word = ""
if n % 3 == 0:
word += "Fizz"
if n % 5 == 0:
word += "Buzz"
# An empty word means neither 3 nor 5 divides n.
if word == "":
return str(n)
return wordÖnce 15'i, sonra 3'ü, sonra 5'i kontrol et
Sezgi
Hem 3'e hem de 5'e bölünebilen bir sayı, tam olarak 15'e bölünebilen bir sayıdır; çünkü 3 ve 5'in ortak böleni yoktur. Dolayısıyla birleşik kural tek bir kontroldür: n % 15 == 0 ve bu kontrol ilk sırada yapılır. Bu koşul sağlanmazsa, 3'e uyması yalnızca 3'e, 5'e uyması ise yalnızca 5'e karşılık gelir. Her kontrol hemen sonuç döndürür ve hiçbir koşul eşleşmezse sayıyı bir dize olarak döndürürsün.
Algoritma
- Eğer
n % 15 == 0ise"FizzBuzz"döndür. - Eğer
n % 3 == 0ise"Fizz"döndür. - Eğer
n % 5 == 0ise"Buzz"döndür. - Aksi hâlde
ndeğerini, her rakamı yazıyla yazarak bir metne dönüştürüp döndür.
def fizzBuzz(n):
if n % 15 == 0:
return "FizzBuzz"
if n % 3 == 0:
return "Fizz"
if n % 5 == 0:
return "Buzz"
return str(n)
Tuzaklar ve uç durumlar
- 15'ten önce 3 veya 5'i kontrol edip hemen döndürmek: 15, 30 ve 45 sonuç olarak
"Fizz"verir. - Bir dize yerine sayıyı döndürmek. 7. tur
"7"olur. - Büyük sayıları bilimsel gösterime dönüştürmek. R'de doğrudan dönüştürme, 10^9 sayısını
1e+09olarak yazdırır;format(n, scientific = FALSE)kullanın. - Yanıtı döndürmek yerine yazdırmak.
Sıkça sorulan sorular3
Kodlama mülakatlarında neden FizzBuzz sorulur?
Kısa bir kural listesini çalışan koda dönüştürebildiğini kontrol eder: kalan testi, doğru sıradaki koşullar ve doğru dönüş türü. Düzenli olarak kod yazan biri için birkaç dakika sürer, bu yüzden daha zor sorulardan önce hızlı bir eleme olarak işe yarar.
FizzBuzz'ı modülo operatörü kullanmadan çözebilir misin?
Evet. Tam sayı bölmesiyle bölün, bölümü tekrar çarpın ve n ile karşılaştırın: yalnızca geriye kalan olmadığında eşittirler. Dizinin tamamını yazdırırken, 3'te ve 5'te sıfırlanan iki sayaç da tutabilirsiniz.
FizzBuzz'ın zaman karmaşıklığı nedir?
Tek bir sayı için yanıt vermek O(1)'dir: sabit sayıda kalan kontrolü ve en fazla 10 basamaklı bir sayının dönüştürülmesi. 1'den n'ye kadar olan diziyi yazdırmak O(n)'dir.
Benzer problemler
Aynı fikirleri kullanan problemler. İki üçünü çözmek bir kalıbı kalıcı hale getirir.
def fizzBuzz(n):
# Kodu buraya yazınTest #1
Test #2
Argüman
n = 15
Beklenen Çıktı
"FizzBuzz"