日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ThoughtWorks代码挑战——FizzBuzzWhizz

發(fā)布時(shí)間:2025/3/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ThoughtWorks代码挑战——FizzBuzzWhizz 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

很久沒發(fā)表過文章了,今天看到一篇文章?最難面試的IT公司之ThoughtWorks代碼挑戰(zhàn)——FizzBuzzWhizz游戲(C#解法)

看到LZ的2B青年代碼,實(shí)在是慘不忍睹,故寫篇文章來探討下這類問題的一般思考。

原題:

FizzBuzzWhizz?
你是一名體育老師,在某次課距離下課還有五分鐘時(shí),你決定搞一個(gè)游戲。此時(shí)有100名學(xué)生在上課。游戲的規(guī)則是:

1. 你首先說出三個(gè)不同的特殊數(shù),要求必須是個(gè)位數(shù),比如3、5、7。

2. 讓所有學(xué)生拍成一隊(duì),然后按順序報(bào)數(shù)。

3. 學(xué)生報(bào)數(shù)時(shí),如果所報(bào)數(shù)字是第一個(gè)特殊數(shù)(3)的倍數(shù),那么不能說該數(shù)字,而要說Fizz;如果所報(bào)數(shù)字是第二個(gè)特殊數(shù)(5)的倍數(shù),那么要說Buzz;如果所報(bào)數(shù)字是第三個(gè)特殊數(shù)(7)的倍數(shù),那么要說Whizz。

4. 學(xué)生報(bào)數(shù)時(shí),如果所報(bào)數(shù)字同時(shí)是兩個(gè)特殊數(shù)的倍數(shù)情況下,也要特殊處理,比如第一個(gè)特殊數(shù)和第二個(gè)特殊數(shù)的倍數(shù),那么不能說該數(shù)字,而是要說FizzBuzz, 以此類推。如果同時(shí)是三個(gè)特殊數(shù)的倍數(shù),那么要說FizzBuzzWhizz。?
5. 學(xué)生報(bào)數(shù)時(shí),如果所報(bào)數(shù)字包含了第一個(gè)特殊數(shù),那么也不能說該數(shù)字,而是要說相應(yīng)的單詞,比如本例中第一個(gè)特殊數(shù)是3,那么要報(bào)13的同學(xué)應(yīng)該說Fizz。如果數(shù)字中包含了第一個(gè)特殊數(shù),那么忽略規(guī)則3和規(guī)則4,比如要報(bào)35的同學(xué)只報(bào)Fizz,不報(bào)BuzzWhizz。

?

一道看似簡(jiǎn)單的題目,其實(shí)并沒有那么簡(jiǎn)單,如果你直接寫的話,那估計(jì)就是:

if, if , else if , if , for, [0] [1] [2]….

我們來理解下這道題:

1. 你首先說出三個(gè)不同的特殊數(shù),要求必須是個(gè)位數(shù),比如3、5、7。

不同的三個(gè)數(shù),必須是個(gè)位數(shù),這些都是驗(yàn)證條件,你注意到了嗎?

2. 讓所有學(xué)生拍成一隊(duì),然后按順序報(bào)數(shù)。

生成順序的數(shù)字。

3. 學(xué)生報(bào)數(shù)時(shí),如果所報(bào)數(shù)字是第一個(gè)特殊數(shù)(3)的倍數(shù),那么不能說該數(shù)字,而要說Fizz;如果所報(bào)數(shù)字是第二個(gè)特殊數(shù)(5)的倍數(shù),那么要說Buzz;如果所報(bào)數(shù)字是第三個(gè)特殊數(shù)(7)的倍數(shù),那么要說Whizz。

規(guī)則:如果是某個(gè)特殊數(shù)的倍數(shù),輸出對(duì)應(yīng)的值,否則輸出數(shù)字。

4. 學(xué)生報(bào)數(shù)時(shí),如果所報(bào)數(shù)字同時(shí)是兩個(gè)特殊數(shù)的倍數(shù)情況下,也要特殊處理,比如第一個(gè)特殊數(shù)和第二個(gè)特殊數(shù)的倍數(shù),那么不能說該數(shù)字,而是要說FizzBuzz, 以此類推。如果同時(shí)是三個(gè)特殊數(shù)的倍數(shù),那么要說FizzBuzzWhizz。

規(guī)則:如果是多個(gè)特殊數(shù)的倍數(shù),輸出所有的對(duì)應(yīng)值。

5. 學(xué)生報(bào)數(shù)時(shí),如果所報(bào)數(shù)字包含了第一個(gè)特殊數(shù),那么也不能說該數(shù)字,而是要說相應(yīng)的單詞,比如本例中第一個(gè)特殊數(shù)是3,那么要報(bào)13的同學(xué)應(yīng)該說Fizz。如果數(shù)字中包含了第一個(gè)特殊數(shù),那么忽略規(guī)則3和規(guī)則4,比如要報(bào)35的同學(xué)只報(bào)Fizz,不報(bào)BuzzWhizz。

規(guī)則:如果包含第一個(gè)特殊數(shù)字,則只輸出第一個(gè)特殊數(shù)字所對(duì)應(yīng)的值。

?

OK,思考下我們?cè)撛鯓幼?#xff1f;。。

?

我們來抽象的理解下題目: “給你輸入一堆數(shù)字,然后你根據(jù)一定的規(guī)則進(jìn)行parse,然后輸出parse 的結(jié)果。”

所以這道題目想考察的是你如何定義這些規(guī)則,如何應(yīng)用這些規(guī)則,該如何parse呢?

?

讓我們看下規(guī)則Rule

Rule,有優(yōu)先級(jí),然后可以對(duì)輸入進(jìn)行Parse,然后Parse又需要一個(gè)對(duì)應(yīng)的字典。

所以Rule 像這樣:

abstract class Rule{public abstract int Priority { get; }public Dictionary<int, string> SpecialDictionary { get; set; }public Rule(Dictionary<int, string> specialDictionary){this.SpecialDictionary = specialDictionary;}public bool ParseNum(int num, ref string result){if ((SpecialDictionary != null) && (SpecialDictionary.Count > 0)){return ParseNumCore(num, ref result);}else{return false;}}protected abstract bool ParseNumCore(int num, ref string result);}

?

接著Rule3: 如果是某個(gè)特殊數(shù)的倍數(shù),輸出對(duì)應(yīng)的值,否則輸出數(shù)字,輸出數(shù)字我放到最外層去處理了,當(dāng)然如果需要也可以寫個(gè)Rule2.

class Rule3 : Rule{public Rule3(Dictionary<int, string> specialDictionary): base(specialDictionary){}public override int Priority{get { return 3; }}protected override bool ParseNumCore(int num, ref string result){foreach (var special in SpecialDictionary){if (num % special.Key == 0){result = special.Value;return true;}}return false;}}

?

Rule4:如果是多個(gè)特殊數(shù)的倍數(shù),輸出所有的對(duì)應(yīng)值。

class Rule4 : Rule{public Rule4(Dictionary<int, string> specialDictionary): base(specialDictionary){}public override int Priority{get { return 4; }}protected override bool ParseNumCore(int num, ref string result){List<string> matches = new List<string>();foreach (var special in SpecialDictionary){if (num % special.Key == 0){matches.Add(special.Value);}}if (matches.Count > 1){result = string.Join("", matches);return true;}else{return false;}}}

?

Rule5:如果包含第一個(gè)特殊數(shù)字,則只輸出第一個(gè)特殊數(shù)字所對(duì)應(yīng)的值。

class Rule5 : Rule{public Rule5(Dictionary<int, string> specialDictionary): base(specialDictionary){}public override int Priority{get { return 5; }}protected override bool ParseNumCore(int num, ref string result){if (SpecialDictionary.Count > 0){var firstSpecial = SpecialDictionary.First();if (num.ToString().Contains(firstSpecial.Key.ToString())){result = firstSpecial.Value;return true;}}return false;}}

?

接下來:最重要的就是Parse 邏輯了,想一想應(yīng)該怎樣調(diào)用這些Rule呢(visitor ?):

foreach (var student in studentNums){string parseResult = student.ToString();foreach (Rule rule in rules){if (rule.ParseNum(student, ref parseResult)){break;}}Console.WriteLine(parseResult);}

?

下面是完整的代碼:

private static void FizzBuzz(){bool isValidInput = false;do{Console.WriteLine("please input three numbers which is units digit, use ',' division ");string[] inputNums = Console.ReadLine().Split(',');if (ValidSpecialInput(inputNums)){isValidInput = true;// create special dictionary to parse the students nums.Dictionary<int, string> special = new Dictionary<int, string>();special.Add(Int32.Parse(inputNums[0]), "Fizz");special.Add(Int32.Parse(inputNums[1]), "Buzz");special.Add(Int32.Parse(inputNums[2]), "Whizz");// get students nums.int studentsCount = 100;var studentNums = Enumerable.Range(1, studentsCount);// create rules to parse.var rules = new List<Rule>() { new Rule5(special),new Rule4(special), new Rule3(special), }.OrderByDescending(r => r.Priority);// parse logic.foreach (var student in studentNums){string parseResult = student.ToString();foreach (Rule rule in rules){if (rule.ParseNum(student, ref parseResult)){break;}}Console.WriteLine(parseResult);}Console.ReadLine();}else{Console.WriteLine("the input is not valid.");}}while (isValidInput == false);}private static bool ValidSpecialInput(string[] specialInputs){bool result = false;if (specialInputs.Length == 3){return specialInputs.All(input =>{int num = 0;return Int32.TryParse(input, out num) && (num > 0) && (num < 10);});}return result;}

?

一些后續(xù)思考:

1:如果輸入的不是三個(gè),而是4個(gè),5個(gè) special, 應(yīng)該怎么改?

2:如果學(xué)生數(shù)量不是100個(gè),是1000個(gè)?

3:如果有限考慮Rule3,然后是Rule4,Rule5,應(yīng)該怎么改?

4:如果還有另一個(gè)限制條件:比如如果數(shù)字是素?cái)?shù),把對(duì)應(yīng)的值按反序輸出,如何處理?

5:如果輸入不是數(shù)字,而是字符串,應(yīng)該如何處理?






本文轉(zhuǎn)自LoveJenny博客園博客,原文鏈接:http://www.cnblogs.com/LoveJenny/p/3706459.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者 與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的ThoughtWorks代码挑战——FizzBuzzWhizz的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。