在網上看到這么一條十分有趣的題目:
你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞一個游戲。此時有100名學生在上課。游戲的規則是:
- 你首先說出三個不同的特殊數,要求必須是個位數,比如3、5、7。
- 讓所有學生拍成一隊,然后按順序報數。
- 學生報數時,如果所報數字是第一個特殊數(3)的倍數,那么不能說該數字,而要說Fizz;如果所報數字是第二個特殊數(5)的倍數,那么要說Buzz;如果所報數字是第三個特殊數(7)的倍數,那么要說Whizz。
- 學生報數時,如果所報數字同時是兩個特殊數的倍數情況下,也要特殊處理,比如第一個特殊數和第二個特殊數的倍數,那么不能說該數字,而是要說FizzBuzz, 以此類推。如果同時是三個特殊數的倍數,那么要說FizzBuzzWhizz。
- 學生報數時,如果所報數字包含了第一個特殊數,那么也不能說該數字,而是要說相應的單詞,比如本例中第一個特殊數是3,那么要報13的同學應該說Fizz。如果數字中包含了第一個特殊數,那么忽略規則3和規則4,比如要報35的同學只報Fizz,不報BuzzWhizz。
現在,我們需要你完成一個程序來模擬這個游戲,它首先接受3個特殊數,然后輸出100名學生應該報數的數或單詞
看到這道題,我的第一反應想到的就是%取模,for循環,思路還算是清晰吧。那么我們再進行細致點的分析,條件上有3個點,
- 只是一個特殊數的倍數
- 兩個或者三個特殊數的倍數
- 包涵第一個特殊數的特殊情況!
那么我們首先要做的是for一個1~100來吧,然后,判斷每個數字,是否匹配這幾個條件。
function num() {
var arr = [3, 5, 7];
var str = ["Fizz", "Buzz", "Whizz"];
for (var i = 1; i <= 100; i++) {
var strr;
if (i % arr[0] !== 0 && i % arr[1] !== 0 && i % arr[2] !== 0) {
strr = i;
}
if (i % arr[1] == 0) {
strr += "Buzz";
}
if (i % arr[1] == 0) {
strr += "Buzz";
}
if (i % arr[2] == 0) {
strr += "Whizz";
}
}
}
寫到這里的時候我陷入的瓶頸,好多的判斷啊,很麻煩,左思右想的,突然想起了,三元運算符,一下子,就通了。
//a為1~100之間的數
//b為特殊數
//c為為特殊數對應的輸出
//這個方法是 判斷是否為特殊數
function str(a, b, c) {
return a % b === 0 ? c : "";
}
function num() {
var arr = [3, 5, 7];
var str = ["Fizz", "Buzz", "Whizz"];
for (var i = 1; i <= 100; i++) {
//因為條件2 說明遇到同時是兩個或者3個特殊數的倍數時,需要疊加
var str = str(i, arr[0], str[0]) + str(i, arr[1], str[1]) + str(i, arr[2], str[2]);
}
}
此時,變量str的值,不是為“”,就是為特殊字符。接下來,需要做出判斷,當str=“”時,我們希望輸出的是i。另外,還有條件3 的沒有進行判斷。
//a為1~100之間的數
//b為特殊數
//c為為特殊數對應的輸出
//這個方法是 判斷是否為特殊數
function Rstr(a, b, c) {
return a % b === 0 ? c : "";
}
function num() {
var arr = [3, 5, 7];
var str = ["Fizz", "Buzz", "Whizz"];
for (var i = 1; i <= 100; i++) {
//因為條件2 說明遇到同時是兩個或者3個特殊數的倍數時,需要疊加
var str2 = Rstr(i, arr[0], str[0]) + Rstr(i, arr[1], str[1]) + Rstr(i, arr[2], str[2]);
var res;
if ((i + "").indexOf(arr[0]) !== -1) {
res = str[0];
} else if (str2 == "") {
res = i;
} else {
res = str2;
}
console.log(res)
}
}
很好,輸出的就是我們要的結果。再進一步的優化下代碼!運用的還是三元運算符。最終代碼為:
//a為1~100之間的數
//b為特殊數
//c為為特殊數對應的輸出
//這個方法是 判斷是否為特殊數
function Rstr(a, b, c) {
return a % b === 0 ? c : "";
}
//x,y,z為特殊數
function num(x, y, z) {
for (var i = 1; i <= 100; i++) {
//因為條件2 說明遇到同時是兩個或者3個特殊數的倍數時,需要疊加
var str2 = Rstr(i, x, "Fizz") + Rstr(i, y, "Buzz") + Rstr(i, z, "Whizz");
console.log((i + "").indexOf(x) !== -1 ? "Fizz" : str2 !== "" ? str2 : i)
}
};
num("3", "5", "7")