FizzBuzz — Zadanie rekrutacyjne #1

Czego szuka rekruter: rozumienie operatora modulo, warunki złożone, kolejność sprawdzania warunków
Poziom: Junior
Zadanie
Napisz funkcję, która dla liczby całkowitej n zwraca:
"FizzBuzz"jeślinjest podzielne przez 3 i przez 5"Fizz"jeślinjest podzielne przez 3"Buzz"jeślinjest podzielne przez 5- string z liczbą w pozostałych przypadkach
Wyświetl wyniki dla liczb 1–100.
Czego szuka rekruter
FizzBuzz nie jest testem wiedzy o operatorze modulo — to test myślenia. Rekruter patrzy na:
- Kolejność warunków — czy kandydat sprawdza
% 15przed% 3i% 5(lub buduje string kumulatywnie) - Czytelność —
% 15vs% 3 == 0 && % 5 == 0 - Ekstrakcja do metody — czy kandydat wydziela logikę z pętli
- Rozszerzalność — co gdyby dodać “Jazz” dla 7?
Najczęstszy błąd: sprawdzanie % 3 i % 5 osobno i pisanie "Fizz" + "Buzz" bez sprawdzenia % 15 — co i tak daje "FizzBuzz", ale drugi if nadpisuje wynik jeśli kandydat użył else if.
Edge cases do przemyślenia
n = 0— podzielne przez wszystko (0 % n == 0 dla każdego n > 0)- liczby ujemne —
-15też jest podzielne przez 15 n = 1— żadna z reguł
Rozwiązanie
static string FizzBuzz(int n)
{
// Budowanie stringa kumulatywnie — rozszerzalne
var result = string.Empty;
if (n % 3 == 0) result += "Fizz";
if (n % 5 == 0) result += "Buzz";
return result.Length > 0 ? result : n.ToString();
}
// Użycie:
for (int i = 1; i <= 100; i++)
Console.WriteLine(FizzBuzz(i));
Alternatywa — ternary (czytelna, ale mniej rozszerzalna)
static string FizzBuzz(int n) =>
n % 15 == 0 ? "FizzBuzz" :
n % 3 == 0 ? "Fizz" :
n % 5 == 0 ? "Buzz" :
n.ToString();
Alternatywa — LINQ (na rozmowie rekrutacyjnej można pokazać jako bonus)
var output = Enumerable.Range(1, 100).Select(FizzBuzz);
foreach (var line in output)
Console.WriteLine(line);
Testy jednostkowe
[Theory]
[InlineData(1, "1")]
[InlineData(3, "Fizz")]
[InlineData(5, "Buzz")]
[InlineData(15, "FizzBuzz")]
[InlineData(30, "FizzBuzz")]
[InlineData(100, "Buzz")]
[InlineData(99, "Fizz")]
public void FizzBuzz_ReturnsCorrectValue(int input, string expected)
{
Assert.Equal(expected, FizzBuzz(input));
}
Co powiedzieć na rozmowie
“Wersja kumulatywna z dwoma osobnymi if jest lepsza niż if/else if z % 15, bo łatwiej ją rozszerzyć — gdyby trzeba było dodać 'Jazz' dla 7, wystarczy dołożyć jeden if (n % 7 == 0) result += 'Jazz' bez przepisywania całej logiki.”
Podsumowanie
| Podejście | Zalety | Wady |
|---|---|---|
| Kumulatywny string | Rozszerzalny, brak % 15 | Nieco mniej oczywisty |
Ternary % 15 | Zwięzły | Twardokodowane reguły |
| LINQ | Funkcyjny styl | Overhead dla prostego zadania |
9 comments
Dodaj komentarz
Musisz się zalogować, aby móc dodać komentarz.
Zamień wiedzę w umiejętności
Pobierz darmową Roadmapę .NET i ułóż takie tematy jak ten w spójną ścieżkę do pierwszej pracy.
Pobieram roadmapę →
Oto moje rozwiązanie
for (int i = 1; i <= 100; i++)
{
if (i % 3 == 0 && i % 5 == 0)
{
Console.WriteLine("FizzBuzz");
}
else if (i % 3 == 0)
{
Console.WriteLine("Fizz");
}
else if (i % 5 == 0)
{
Console.WriteLine("Buzz");
}
else
{
Console.WriteLine(i);
}
}
Dzięki za Twoje rozwiązanie, działa 🙂 , pozdrawiam
Bardzo częste zadanie rekrutacyjne, moje rozwiązanie
for (int i = 1; i <= 100; i++)
{
if (i % 15 == 0)
Console.WriteLine("FizzBuzz");
else if (i % 3 == 0)
Console.WriteLine("Fizz");
else if (i % 5 == 0)
Console.WriteLine("Buzz");
else
Console.WriteLine(i);
}
Dzięki za Twoje rozwiązanie, również działa 🙂 , pozdrawiam
for (int i = 1; i <= 100; i++)
{
string res = (i % 3 == 0 && i % 5 == 0) ? "FizzBuzz" :
(i % 3 == 0) ? "Fizz" :
(i % 5 == 0) ? "Buzz" :
i.ToString();
Console.WriteLine(res);
}
Dzięki za Twoje rozwiązanie, również oczywiście działa 🙂 , pozdrawiam
ja tez mam rozwiazanie
private static void DoFizzBuzz()
{
for (int i = 1; i <= 100; i++)
{
bool fizz = i % 3 == 0;
bool buzz = i % 5 == 0;
if (fizz && buzz)
Console.WriteLine("FizzBuzz");
else if (fizz)
Console.WriteLine("Fizz");
else if (buzz)
Console.WriteLine("Buzz");
else
Console.WriteLine(i);
}
}
Dzięki za Twoje rozwiązanie, również działa 🙂 , pozdrawiam
Paul Getty Zwykle Twierdzil, że bezinteresowna przyjazń może istnieć tylko pomiedzy osobami o jednakowych dochodach. I ja sie po niekąd z tym zgadzam 🙂 A ty ?