另一个FizzBu​​zz解决方案

时间:2017-08-02 07:15:12

标签: php fizzbuzz

我正在接受面试,并被要求用PHP解决FizzBu​​zz。

  

编写一个程序,打印从1到100的数字。但是对于三个打印的“Fizz”而不是数字的倍数和五个打印“Buzz”的倍数。对于三和五的倍数的数字打印“FizzBu​​zz”。

我之前从未听说过FizzBu​​zz,但这是我解决它的方法:

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 />";
   }
}

我用Google搜索并没有找到任何圆形解决方案,这让我觉得它可能有问题,这是我发现的接近我的解决方案之一:

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 个答案:

答案 0 :(得分:3)

实际上他们正在测试你将如何解决这么简单的任务。它应该是可扩展的优化,代码应该清晰易读。

您的代码版本不好。 您在互联网上找到的版本更好,但从优化的角度来看它并不理想。

尝试思考如何以更少的行动来实现目标。

一些提示:

  • 不要为此任务使用函数(例如范围) - 它只会减慢脚本执行时间
  • 使用operator&#34; for&#34;对于这个任务,不要使用任何其他(while,do-while,foreach),因为运算符&#34; for&#34;在这种情况下最适合(你知道你需要多少次迭代)。
  • 不使用round函数,使用模运算符&#34;%&#34;,因为任何函数的运行速度都比任何运算符慢
  • 在结果中您需要获取代码,其中操作次数将尽可能少(&#34; if&#34;语句的数量,&#34;等操作符的数量; ==&#34;或&#34;%&#34;

    • 使用15代替%3&amp;&amp; %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>';
    }
}

答案 1 :(得分:2)

如果你仔细阅读它说&#34; instead&#34;。

这是FizzBu​​zz问题的另一个简短而干净的解决方案:

foreach (range(1, 100) as $number) {
    if(0 !== $number % 3 && 0 !== $number % 5) {
        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 :(得分:2)

代码风格和缺乏优化给面试官带来了新手的印象。我的提示是:

  • 关注PSR-2
  • 永远不要使用else(重组,使用提前退货/继续)
  • 始终尝试减少ifs(代码复杂度)的数量
  • 在处理整数和空值(以及任何其他类型)
  • 时,使用“相同”运算符进行比较
  • 当从未提及HTML
  • 时,请勿使用<br/>
  • 尽量保持可维护性:
    • 提取变量/函数中的匹配计算,以便轻松更改
    • 不要过度复杂。
  • 尝试以数学方式优化:
    • 使用%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;
}

Test

还有另一个棘手的解决方案

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;
}