強強聯手,網際網路垂直招聘專家拉勾網攜手全球頂尖IT公司ThoughtWorks共同推出此次代碼挑戰!等你來打擂!
題目:
FizzBuzzWhizz
你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞一個遊戲。此時有100名學生在上課。遊戲的規則是:
1. 你首先說出三個不同的特殊數,要求必須是個位數,比如3、5、7。
2. 讓所有學生拍成一隊,然後按順序報數。
3. 學生報數時,如果所報數字是第一個特殊數(3)的倍數,那麼不能說該數字,而要說Fizz;如果所報數字是第二個特殊數(5)的倍數,那麼要說Buzz;如果所報數字是第三個特殊數(7)的倍數,那麼要說Whizz。
4. 學生報數時,如果所報數字同時是兩個特殊數的倍數情況下,也要特殊處理,比如第一個特殊數和第二個特殊數的倍數,那麼不能說該數字,而是要說FizzBuzz, 以此類推。如果同時是三個特殊數的倍數,那麼要說FizzBuzzWhizz。
5. 學生報數時,如果所報數字包含了第一個特殊數,那麼也不能說該數字,而是要說相應的單詞,比如本例中第一個特殊數是3,那麼要報13的同學應該說Fizz。如果數字中包含了第一個特殊數,那麼忽略規則3和規則4,比如要報35的同學隻報Fizz,不報BuzzWhizz。
現在,我們需要你完成一個程式來模拟這個遊戲,它首先接受3個特殊數,然後輸出100名學生應該報數的數或單詞。比如,
輸入
3,5,7
輸出(片段)
1
2
Fizz
4
Buzz
Fizz
Whizz
8
Fizz
Buzz
11
Fizz
Fizz
Whizz
FizzBuzz
16
17
Fizz
19
Buzz
…
一直到100
看到此題,經過分析3,4,5中5的優先級比較高,是以判斷時先考慮判斷5,然後再判斷3,4,第一個想法的代碼如下:
public static void fbw(int[] num) {
String[] words = { "Fizz", "Buzz", "Whizz" };
for (int n = 1; n < 101; n++) {
if ( n / 10 == num[0] || n % 10 == num[0])
System.out.println(words[0]);
else {
String str = "";
for (int i = 0; i < 3; i++) {
if (n % num[i] == 0)
str += words[i];
}
if (str.length() == 0)
str += n ;
System.out.println(str);
}
}
}
一、num參數表示設定的初始三個特殊數。
二、由于隻有一個3位數100,是以也得考慮3位數的情況,1位或者2兩位均可由n / 10 == num[0] || n % 10 == num[0]來解決;3位數100n / 100 == num[0] || n % 100 == num[0]來解決。如果考慮特殊數為1的情況,你們所有 的人都得報Fizz。
三、除上述情況外,就需要根據是否是三個特殊數的倍數來決定所報的内容,這裡要周遊三個特殊數。
四、100的循環貌似性能差别甚小,一個優化貌似可以将String類型換位StringBuilder。。。
五、自己玩的,就不參與也不送出代碼了。。。。呵呵
以上隻是一種解決辦法,這種辦法應該是最容易想和最容易實作的辦法吧,繼續考慮其它更優的辦法。。一個是O(n),n=100,二次循環可以換為一連串的if-else而已,沒啥意思。。。。就不再改動了。。。
據說有用10行代碼搞定的,不知道啥語言啊???
看到有人發這個相關的文章,本來29号晚上就寫好這個文章了,本想着利用假期考慮考慮還有沒有其他的解法,結果沒時間了。。。就這樣吧……
你扯淡,我就扯淡!!你不扯淡,我也扯淡!!是以,我們就扯淡吧。。。