FizzBuzzWhizz試題之悠然版解答

2021-06-22 06:41:58 字數 4623 閱讀 7151

你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞乙個遊戲。此時有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。

據說是直接用來面試的,呵呵,很明顯,寫得少不是目標,寫得快也不是目標,怎麼樣優雅的解決此問題還是重點。

如果用乙個方法解決了此問題的同學,我可以負責任的說,基本上沒有啥戲了。

悠然的方法不是最快的,悠然的方法也不是最小的,因此從這兩個方面與悠然比較的,悠然承認落敗了。

悠然主要從擴充套件性及**的優雅性方面來做一下解答,也順便普及一下設計方面的一些心得體會,與大家分享。

此題明顯是搞了一堆複雜的計算規則,來擾亂程式設計師的心靈,干擾程式設計師的思路,弄亂程式設計師的**,出題之人是心懷叵測呀。但是拋開現象看本質,它就是讓學生報數,然後在報數的時候要遵循一系列的規則。那麼,很明顯是可以按規則引擎的思路來解決的。(話外音:凡是有大量if語句,case語句的多都可以歸到規則引擎範疇)。

簡單的分析,可以把試題中的規則進行如下分類:

1.如果是包含第乙個特殊數字的,直接讀出拉倒

2.如果是能被其中幾個特殊數字整除的,則要讀出幾個特殊的數字對應的文字

3.如果不是上面兩種情況,就直接讀出數字

ok,原來這麼簡單,那就開工了

/**

* created by luoguo on 2014/5/6.

*/public inte***ce numberreader extends comparable

設定了3個介面方法,乙個返回優先順序,乙個返回是否是排它的,乙個去讀數字,如果有讀過,則返回true,如果沒有讀過,就返回false、

另外,之所以繼承了comparable介面,是為了對規則進行排序。

為了避免後續的程式複製,因此搞乙個抽象類:

/**

* created by luoguo on 2014/5/6.

*/public abstract class abstractnumberreader implements numberreader

public int getpriority()

public boolean i***clusive()

public int compareto(numberreader numberreader)

if (priority < numberreader.getpriority())

return 0;}}

上面的抽象類已經把複製的**都寫完了,接下來看實現類。

public class commonnumberreader extends abstractnumberreader 

public boolean read(int number)

}

普通的數字,其優先順序為0,屬於排它處理,不管3721,只要到我這裡,我就一定會處理並返回true。

/**

* created by luoguo on 2014/5/6.

*/public class includenumberreader extends abstractnumberreader

public boolean read(int number)

return false;}}

包含數字時的處理,設定優先順序為2,排它性為true,如果包含了對應的數字才處理。

/**

* created by luoguo on 2014/5/6.

*/public class multiplenumberreader extends abstractnumberreader

public boolean read(int number)

return false;}}

倍數處理器,它的優先順序是1,是非排它的,只要是指定數的整數倍,就處理。

上面就寫完了所有的規則。

下面是規則引擎了,呵呵,由於比較簡單,沒有抽象介面,直接就實現了。如果是複雜的,可能應該抽象成介面,使得引擎也可以進行調整。

/**

* created by luoguo on 2014/5/6.

*/public final class numberreaderengine

/*** 在呼叫readnumber之前必須呼叫sortnumberreader

*/public void sortnumberreader()

public void readnumber(int number)

private void executereadnumber(int number)

boolean isread = numberreader.read(number);

if (isread) else }}

}}

引擎幹的事情,很簡單,就是新增規則,對規則進行排序,然後利用引擎對數字進行讀出處理。

/**

* created by luoguo on 2014/5/6.

*/public class testclass }}

測試**很簡單,就是新增一堆規則,然後讀數字就好了

1

2fizz

4buzz

fizz

whizz

8fizz

buzz

11fizz

fizz

whizz

fizzbuzz

1617

fizz

19buzz

fizzwhizz

22fizz

fizz

buzz

26fizz

whizz

29fizz

fizz

fizz

fizz

fizz

fizz

fizz

fizz

fizz

fizz

buzz

41fizzwhizz

fizz

44fizzbuzz

4647

fizz

whizz

buzz

fizz

52fizz

fizz

buzz

whizz

fizz

5859

fizzbuzz

6162

fizz

64buzz

fizz

6768

fizz

buzzwhizz

71fizz

fizz

74fizzbuzz

76whizz

fizz

79buzz

fizz

82fizz

fizzwhizz

buzz

86fizz

8889

fizzbuzz

whizz

92fizz

94buzz

fizz

97whizz

fizz

buzz

**行統計

從上面看到,總共的**行數是122行,去掉15行測試**行,7行package宣告,剛好100行。

從上面的**可以看到,邏輯是可以方便的自由的增加的,比如,說,不僅是第乙個特殊數字,第二個第三個特殊數字,也要用同樣的邏輯,只要:

numberreaderengine.add(new includenumberreader(5,"buzz"));

numberreaderengine.add(new includenumberreader(7,"whizz"));

就可以了,不必修改計算邏輯。當然,也可以繼續增加各種各樣的邏輯。

對於複雜的問題,要有抽絲剝繭的能力,仔細分析、認真設計,最後可以給出乙個易於維護,易於擴充套件,易於理解,易於維護的解決方案。

想獲得原始碼的同學,請到下面的路徑:

osc==>  /tinyframework/fizzbuzzwhizz.git

插播題解一則 FizzBuzzWhizz

今天演示一道題及用python的一種解答,算是對前面內容的總結性應用 fizzbuzzwhizz 你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞乙個遊戲。此時有100名學生在上課。遊戲的規則是 1.你首先說出三個不同的特殊數,要求必須是個位數,比如3 5 7。2.讓所有學生拍成一隊,然後按...

試題 歷屆試題 翻硬幣

時間限制 1.0s 記憶體限制 256.0mb 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的...

試題 歷屆試題 翻硬幣

試題 歷屆試題 翻硬幣 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現...