FizzBuzzWhizz题目需求:
when run (3) return 'Fizz'
when run(5) retunr 'Buzz'
when run(7) retunr 'Whizz'
when run(3×5) retunr 'FizzWhizz' //run 的参数为3和5共同的倍数
when run(3×7) retunr 'FizzBuzz' //run 的参数为3和7共同的倍数
when run(5×7) return 'BuzzWhizz' //run 的参数为5和7共同的倍数
when run(3×5×7) return 'FizzBuzzWhizz' //run 的参数为3和5和7共同的倍数
when run(n) return n //n 可以为非3,5,7或3,5,7的倍数的数字,如:run(2) return '2'
分析
测试数据及预期结果
input | |
---|---|
3 | " F i z z " |
5 | " B u z z " |
7 | " W h i z z " |
3 × 5 | " F i z z B u z z " |
3 × 7 | " F i z z W h i z z " |
5 × 7 | " B u z z W h i z z " |
3 × 5 × 7 | " F i z z B u z z W h i z z" |
从题目来看,这道题的逻辑并不复杂,无非是判定是否为3,5,7的倍数,再根据判定结果输出相应的字符串,判定是否为倍数可通过取模运算来实现;同时,根据题目要求,很明显可以看出,当输入数字为多个因子的公倍数时,输出的复杂字符串是由各个简单字符串根据不同的优先级进行拼接而成,那么可根据不同的优先级来调整其约数判定顺序,从而实现字符串的优先级排列。
我尝试用TDD的方式来编写代码,先写测试,再写实现,保证在每一次测试时都满足我的测试需求,再逐步添加需求,写出的代码如下:
function run(num){
var result=num.toString();
if(num%3==0){
result="Fizz";
if(num%5==0){
result=result+"Buzz";
}
if(num%7==0){
result=result+"Whizz";
}
}else if(num%5==0){
result="Buzz";
if(num%7==0){
result=result+"Whizz";
}
}else if(num%7==0){
result="Whizz";
}
return result;
}
总测试结果如下:
由代码分析可知,不管是输入8种情况中的任意一种,均需要通过3次判定;
并且,从代码中可以看见有许多重复代码,而这些重复代码执行所需要的判定也是一样的。于是,我尝试将重复的代码进行归并,考虑到当输入为非3,5,7的倍数时,输出与输入相同的数字,还要添加一条判定,如下:
function run(num){
var result="";
if(num%3==0){
result+="Fizz";
}
if(num%5==0){
result+="Buzz";
}
if(num%7==0){
result+="Whizz";
}
if(result==="")
return num.toStirng;
return result;
}
测试结果: