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

FizzBuzz

1.2 Junior🔥 101 комментариев
#Алгоритмы и структуры данных

Условие

Напишите функцию fizzBuzz(n), которая выводит числа от 1 до n со следующими правилами:

  • Для чисел, кратных 3, выводить "Fizz"
  • Для чисел, кратных 5, выводить "Buzz"
  • Для чисел, кратных и 3, и 5, выводить "FizzBuzz"
  • Для остальных чисел выводить само число
function fizzBuzz(n) {
  // Ваш код
}

fizzBuzz(15);
// 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz

Что проверяется

  • Базовая логика программирования
  • Работа с условиями
  • Оператор деления по модулю

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

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

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

Решение

FizzBuzz — классическая задача для проверки базовой логики программирования. Разберу несколько подходов от простого к более элегантному.

Базовый подход с if-else

function fizzBuzz(n: number): void {
  for (let i = 1; i <= n; i++) {
    if (i % 15 === 0) {
      console.log("FizzBuzz");
    } else if (i % 3 === 0) {
      console.log("Fizz");
    } else if (i % 5 === 0) {
      console.log("Buzz");
    } else {
      console.log(i);
    }
  }
}

Ключевой момент: проверяем сначала на 15 (делимое и на 3, и на 5), потом на 3, затем на 5. Порядок важен!

Более элегантный подход с конструированием строки

function fizzBuzz(n: number): void {
  for (let i = 1; i <= n; i++) {
    let output = "";
    
    if (i % 3 === 0) output += "Fizz";
    if (i % 5 === 0) output += "Buzz";
    
    console.log(output || i);
  }
}

Преимущества:

  • Более гибкий код — легко добавить новые правила
  • Избегаем многоуровневых условий
  • output || i — если строка пуста, выводим число

Возвращение массива вместо console.log

function fizzBuzz(n: number): (string | number)[] {
  const result: (string | number)[] = [];
  
  for (let i = 1; i <= n; i++) {
    let output = "";
    
    if (i % 3 === 0) output += "Fizz";
    if (i % 5 === 0) output += "Buzz";
    
    result.push(output || i);
  }
  
  return result;
}

// Использование
const result = fizzBuzz(15);
console.log(result.join(", "));
// 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz

Почему это лучше:

  • Функция чистая (не имеет побочных эффектов)
  • Легче тестировать
  • Можно использовать результат в других операциях

Функциональный подход с map

function fizzBuzz(n: number): (string | number)[] {
  return Array.from({ length: n }, (_, i) => {
    const num = i + 1;
    let output = "";
    
    if (num % 3 === 0) output += "Fizz";
    if (num % 5 === 0) output += "Buzz";
    
    return output || num;
  });
}

Этот вариант более декларативный и функциональный.

С использованием конфигурации (расширяемо)

interface Rule {
  divisor: number;
  word: string;
}

function fizzBuzz(n: number, rules: Rule[] = []): (string | number)[] {
  // Правила по умолчанию
  const defaultRules: Rule[] = [
    { divisor: 3, word: "Fizz" },
    { divisor: 5, word: "Buzz" },
  ];
  
  const activeRules = rules.length > 0 ? rules : defaultRules;
  
  return Array.from({ length: n }, (_, i) => {
    const num = i + 1;
    let output = "";
    
    for (const rule of activeRules) {
      if (num % rule.divisor === 0) {
        output += rule.word;
      }
    }
    
    return output || num;
  });
}

// Использование
const result = fizzBuzz(15);
console.log(result); // [1, 2, "Fizz", 4, "Buzz", ...]

// Можем передать свои правила
const customResult = fizzBuzz(10, [
  { divisor: 2, word: "Even" },
  { divisor: 3, word: "Three" },
]);

Тестирование

const result = fizzBuzz(15);
const expected = [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"];

console.log(JSON.stringify(result) === JSON.stringify(expected)); // true

Выбор решения для интервью

Для интервью рекомендую второй подход (конструирование строки) — он показывает:

  • Понимание логики программирования
  • Аккуратный дизайн кода
  • Избегание излишней сложности

Если просят "на продакшене», упомяните, что вернёте массив вместо console.log, чтобы функция была чистой и тестируемой.

Ключевые моменты:

  • Оператор модуля % проверяет делимость
  • Проверяем все условия независимо (оба if, не else if)
  • Пустая строка в JavaScript falsy, поэтому output || i работает
  • Читаемость важнее, чем микрооптимизация
FizzBuzz | PrepBro