我正在接受面试,并被要求用PHP解决FizzBuzz。
编写一个程序,打印从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 />";
}
}
我用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 />";
}
}
我的代码工作正常,但是我有什么不对,我看不到?
答案 0 :(得分:3)
实际上他们正在测试你将如何解决这么简单的任务。它应该是可扩展的优化,代码应该清晰易读。
您的代码版本不好。 您在互联网上找到的版本更好,但从优化的角度来看它并不理想。
尝试思考如何以更少的行动来实现目标。
一些提示:
在结果中您需要获取代码,其中操作次数将尽可能少(&#34; if&#34;语句的数量,&#34;等操作符的数量; ==&#34;或&#34;%&#34;
我的代码示例:
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;。
这是FizzBuzz问题的另一个简短而干净的解决方案:
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)
代码风格和缺乏优化给面试官带来了新手的印象。我的提示是:
else
(重组,使用提前退货/继续)<br/>
恕我直言,要遵循所有良好做法,您的代码应如下所示:
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;
}