← Назад к вопросам

FizzBuzz

1.0 Junior🔥 231 комментариев
#Коллекции#ООП#Основы Java

Условие

Напишите программу, которая выводит числа от 1 до 100 со следующими правилами:

  • Если число кратно 3, вместо него выводится "Fizz"
  • Если число кратно 5, вместо него выводится "Buzz"
  • Если число кратно и 3, и 5, вместо него выводится "FizzBuzz"
  • В остальных случаях выводится само число

Пример вывода

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...

Требования

  • Решите задачу без использования деления (опционально)
  • Код должен быть чистым и читаемым

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подход

Итерируем от 1 до 100. Для каждого числа проверяем делимость: сначала на 15 (FizzBuzz), затем на 3 (Fizz), затем на 5 (Buzz), иначе выводим само число. Порядок проверки важен.

Решение

public class FizzBuzz {
    
    /**
     * Метод 1: Базовый подход с условиями
     */
    public static void fizzBuzz() {
        for (int i = 1; i <= 100; i++) {
            if (i % 15 == 0) {
                System.out.println("FizzBuzz");
            } else if (i % 3 == 0) {
                System.out.println("Fizz");
            } else if (i % 5 == 0) {
                System.out.println("Buzz");
            } else {
                System.out.println(i);
            }
        }
    }
    
    /**
     * Метод 2: С использованием StringBuilder для конструирования строки
     */
    public static void fizzBuzzStringBuilder() {
        for (int i = 1; i <= 100; i++) {
            StringBuilder result = new StringBuilder();
            
            if (i % 3 == 0) {
                result.append("Fizz");
            }
            
            if (i % 5 == 0) {
                result.append("Buzz");
            }
            
            if (result.length() == 0) {
                result.append(i);
            }
            
            System.out.println(result.toString());
        }
    }
    
    /**
     * Метод 3: Функциональный подход с использованием Stream API
     */
    public static void fizzBuzzStream() {
        java.util.stream.IntStream.rangeClosed(1, 100)
            .forEach(i -> System.out.println(getFizzBuzz(i)));
    }
    
    /**
     * Вспомогательный метод для получения FizzBuzz значения
     */
    public static String getFizzBuzz(int n) {
        if (n % 15 == 0) {
            return "FizzBuzz";
        } else if (n % 3 == 0) {
            return "Fizz";
        } else if (n % 5 == 0) {
            return "Buzz";
        } else {
            return String.valueOf(n);
        }
    }
    
    /**
     * Метод 4: С использованием списка кортежей (правил)
     * Демонстрирует более гибкий подход
     */
    public static void fizzBuzzWithRules() {
        java.util.List<java.util.AbstractMap.SimpleEntry<Integer, String>> rules = 
            java.util.Arrays.asList(
                new java.util.AbstractMap.SimpleEntry<>(15, "FizzBuzz"),
                new java.util.AbstractMap.SimpleEntry<>(3, "Fizz"),
                new java.util.AbstractMap.SimpleEntry<>(5, "Buzz")
            );
        
        for (int i = 1; i <= 100; i++) {
            String output = String.valueOf(i);
            
            for (var rule : rules) {
                if (i % rule.getKey() == 0) {
                    output = rule.getValue();
                    break;
                }
            }
            
            System.out.println(output);
        }
    }
    
    /**
     * Демонстрация и тестирование
     */
    public static void demonstrateFizzBuzz() {
        System.out.println("=== FizzBuzz (первые 20 значений) ===");
        for (int i = 1; i <= 20; i++) {
            System.out.println(i + ": " + getFizzBuzz(i));
        }
    }
    
    public static void main(String[] args) {
        System.out.println("=== Метод 1: Базовые условия ===");
        fizzBuzz();
        
        System.out.println("\n=== Демонстрация ===");
        demonstrateFizzBuzz();
    }
}

Сложность

  • Временная сложность: O(n), где n = 100 (константа, но в общем случае линейна от верхней границы)
  • Пространственная сложность: O(1), используются только переменные, независимо от размера

Примеры вывода

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...

Тест-кейсы

  1. i=1: Вывод "1" (не кратно ни 3, ни 5)
  2. i=3: Вывод "Fizz" (кратно 3)
  3. i=5: Вывод "Buzz" (кратно 5)
  4. i=15: Вывод "FizzBuzz" (кратно и 3, и 5)
  5. i=30: Вывод "FizzBuzz" (кратно 15)
  6. i=99: Вывод "Fizz" (кратно 3)
  7. i=100: Вывод "Buzz" (кратно 5)

Edge cases и типичные ошибки

  1. Порядок проверки: КРИТИЧНО! Сначала проверяем на 15, иначе получим "FizzBuzz" как "Fizz" + "Buzz"
  2. Условия ввещены в if-else: Первый подходящий случай должен быть выполнен
  3. StringBuilder метод более элегантен при масштабировании (легче добавлять новые правила)
  4. Важно использовать i % 15 == 0 перед отдельными проверками i % 3 == 0 и i % 5 == 0
  5. Эта задача часто задаётся чтобы оценить качество кода, умение писать чистый и расширяемый код

Базовый метод с if-else лучше для интервью, он прост и понятен. StringBuilder метод показывает более гибкое мышление.