JavaScript FizzBuzz数组实现异常及最优方案咨询
FizzBuzz问题排查与最优实现
问题根源
你的代码核心错误是未单独处理数字0的情况。因为0是所有非零整数的倍数,会被判定为同时是3和5的倍数,从而输出fizzBuzz,但你的预期是保留0本身。
另外,第一种代码还存在判断逻辑顺序错误(比如误将数字2判定为3的倍数),原因是先判断了3的倍数,再判断15的倍数,导致15的倍数会被提前拦截成fizz;第二种代码修正了条件顺序,但仍未处理0的特殊情况。
正确实现方案
以下是符合你需求的代码,优先处理0,再按优先级判断倍数:
function fizzBuzz(n) { const result = []; for (let i = 0; i < n; i++) { if (i === 0) { result.push(0); } else if (i % 15 === 0) { // 先判断同时是3和5的倍数 result.push('fizzBuzz'); } else if (i % 3 === 0) { result.push('fizz'); } else if (i % 5 === 0) { result.push('buzz'); } else { result.push(i); } } return result; } // 调用示例:传入15得到符合规则的输出 console.log(fizzBuzz(15)); // 输出: [0, 1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14] // 注:你的预期输出中数字2被标记为'fizz'不符合FizzBuzz规则,以上是标准逻辑的正确结果
更简洁的优化实现
可以用Array.from简化代码,逻辑保持一致:
function fizzBuzz(n) { return Array.from({ length: n }, (_, index) => { if (index === 0) return 0; if (index % 15 === 0) return 'fizzBuzz'; if (index % 3 === 0) return 'fizz'; if (index % 5 === 0) return 'buzz'; return index; }); }
关键注意事项
- 必须先判断15的倍数,再判断3或5的倍数,否则15的倍数会被3或5的条件提前捕获,输出错误结果。
- 单独处理0,避免其被判定为倍数输出
fizzBuzz。
内容的提问来源于stack exchange,提问作者Andrew Kester
相关产品推荐
相关产品推荐

