Я был на собеседовании и меня попросили решить 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 />";
}
}
Мой код работает нормально, но что-то не так с ним, что я не вижу?
На самом деле они тестируют, как вы решите такую простую задачу. Он должен быть невероятно оптимизирован, код должен быть чистым и легко читаемым.
Ваша версия кода не подходит.
Версия, которую вы нашли в интернете, лучше, но она не идеальна с точки зрения оптимизации.
Попробуйте подумать, как получить цель с меньшим количеством действий.
Несколько советов:
в результате вам нужно получить код, в котором количество операций будет наименьшим, насколько это возможно (количество операторов if), количество операторов типа «==» или «%»
Мой пример кода:
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>';
}
}
если вы внимательно прочитаете, там написано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
Стиль кода и отсутствие оптимизации создает впечатление новичка для интервьюера. Мои советы:
else
(реструктурировать, использовать досрочный возврат / продолжение)<br/>
когда HTML никогда не упоминаетсяИМХО, чтобы следовать всем хорошим практикам, ваш код должен выглядеть так:
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;
}