Еще одно решение FizzBuzz

Я был на собеседовании и меня попросили решить FizzBuzz с помощью PHP.

Напишите программу, которая печатает числа от 1 до 100. Но для кратных трех выведите «Fizz» вместо числа, а для кратных пяти выведите «Buzz». Для чисел, кратных трем и пяти, выведите «FizzBuzz».

Я никогда не слышал о FizzBuzz раньше, но вот как я решил это:

for ($i = 1; $i <= 100; $i++){
if($i / 3 == round($i / 3) && $i / 5 == round($i / 5)){
echo $i . " is FizzBuzz<br />";
}
else if($i / 3 == round($i / 3)){
echo $i . " is Fizz<br />";
}
else if($i / 5 == round($i / 5)){
echo $i . " is Buzz<br />";
}
else {
echo $i."<br />";
}
}

Я гуглил и не нашел никакого решения с помощью round, и это заставило меня задуматься о том, что, возможно, с этим что-то не так, это одно из найденных мной решений, которое близко к моему:

for ($i = 1; $i <= 100; $i++){
if($i % 3 == 0 && $i % 5 ==0){
echo "FizzBuzz<br />";
}
else if($i % 3 == 0){
echo "Fizz<br />";
}
else if($i % 5 == 0){
echo "Buzz<br />";
}
else {
echo $i."<br />";
}
}

Мой код работает нормально, но что-то не так с ним, что я не вижу?

-3

Решение

На самом деле они тестируют, как вы решите такую ​​простую задачу. Он должен быть невероятно оптимизирован, код должен быть чистым и легко читаемым.

Ваша версия кода не подходит.
Версия, которую вы нашли в интернете, лучше, но она не идеальна с точки зрения оптимизации.

Попробуйте подумать, как получить цель с меньшим количеством действий.

Несколько советов:

  • не используйте функции (такие как диапазон) для этой задачи — это только замедлит время выполнения скрипта
  • используйте оператор «for» для этой задачи, не используйте другие (while, do-while, foreach), потому что оператор «for» лучше всего подходит в этом случае (вы знаете, сколько итераций вам нужно).
  • не используйте функцию округления, используйте оператор модуля «%», потому что любая функция работает медленнее, чем любой оператор
  • в результате вам нужно получить код, в котором количество операций будет наименьшим, насколько это возможно (количество операторов if), количество операторов типа «==» или «%»

    • Используйте 15 вместо% 3 && % 5 — меньше вычислений — быстрее время выполнения.

Мой пример кода:

for ($i = 1; $i <= 100; $i++) {
if ($i % 15 == 0) {
echo 'FizzBuzz<br>';
} elseif ($i % 3 == 0) {
echo 'Fizz<br>';
} elseif ($i % 5 == 0) {
echo 'Buzz<br>';
} else {
echo $i . '<br>';
}
}
2

Другие решения

если вы внимательно прочитаете, там написаноinstead».

это еще одно короткое и чистое решение проблемы FizzBuzz:

foreach (range(1, 100) as $number) {
if(0 !== $number % 15) {
echo $number.'<br>';
continue;
}

if(0 === $number % 3) {
echo 'Fizz';
}

if(0 === $number % 5) {
echo 'Buzz';
}

echo '<br>';
}

выход:

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

Стиль кода и отсутствие оптимизации создает впечатление новичка для интервьюера. Мои советы:

  • следить PSR-2
  • Никогда не используйте else (реструктурировать, использовать досрочный возврат / продолжение)
  • Всегда старайтесь уменьшить количество ifs (сложность кода)
  • Используйте «идентичные» операторы для сравнения при работе с целыми числами и нулями (и любым другим типом)
  • Не использовать <br/> когда HTML никогда не упоминается
  • Постарайтесь сохранить ремонтопригодность:
    • Извлекать вычисления соответствия в переменных / функциях, чтобы их можно было легко изменить
    • Не переусердствуйте.
  • Попробуйте математически оптимизировать:
    • Используйте% 15 вместо% 3 и% 5 чек
    • Вы также можете вообще пропустить вышеупомянутое (проверьте% 15), так как вы уже рассчитали это. Булевы операции намного быстрее.
    • Постарайтесь не рассчитывать что-либо дважды.

ИМХО, чтобы следовать всем хорошим практикам, ваш код должен выглядеть так:

for ($i = 1; $i <= 100; $i++) {
$isFizz = (0 === $i % 3);
$isBuzz = (0 === $i % 5);

if (!$isFizz && !$isBuzz) {
echo $i . PHP_EOL;

continue;
}

if ($isFizz) {
echo 'Fizz';
}

if ($isBuzz) {
echo 'Buzz';
}

echo PHP_EOL;
}

Тестовое задание

Есть еще одно хитрое решение

for ($i = 1; $i <= 100; $i++) {
switch ($i % 15) {
case 3:
case 6:
case 9:
echo 'Fizz';
break;
case 5:
case 10:
echo 'Buzz';
break;
case 0:
echo 'FizzBuzz';
break;
default:
echo $i;
break;
}

echo PHP_EOL;
}
2
По вопросам рекламы [email protected]