拉勾網ThoughtWorks面試題代碼實現


     今天看到一個很有意思的面試活動(活動鏈接),不需要簡歷,只有一道編程題目,在線提交你的代碼即可。

     本菜鳥對面試不感興趣,但題目讓我很興奮,特來挑戰一下~

     或許當你看到這篇博文的時候活動已經失效了,所以小菜就把題目記下來:

 

大道至簡,知易行難!

 

我們的題目簡約而不簡單,千萬不要輕敵,即使簡單的代碼,做到盡善盡美一樣難能可貴,所以,提交之前,請想一想,它是不是可以更卓越,有人可以10行搞定,親,你呢 :)

 

 

代碼要求:

 

1,語言不限,Java, C#, Ruby, C++, Js, Python, Scala, objective-C統統可以,小語種也沒問題,只要你擅長;

 

2,強烈建議寫單元測試;

 

3,請展示出你超贊的面向對象/函數式編程功底;

 

4,建議盡量減少圈復雜度;

 

5,請提交可運行的代碼,及相關構建腳本/說明文檔(代碼運行平台和環境);

 

 

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

 

     題目本身並不難,但考察了很多細節。

     比如,"建議寫單元測試"、"面向對象/函數式編程功底",應該是考察的重點;"有人可以10行搞定",這純屬騙人,不是說不可以用10行代碼搞定,靠一些非常規技巧,是可以實現,但這顯然不是可維護的代碼,也展現不出你的功力,當真你就上當了。

     小菜選用的語言是JavaScript,因為她比較簡單,也不需要什么環境,瀏覽器就可以了~

     小菜寫的僅僅是一個簡單實現,給大家分享思路,不足之處多多包涵。

 

fbw.js

 1 //定義游戲封裝"類"
 2 //max 整數上限,params 規定的數據結構
 3 var fbw = function(max,params){
 4   this.params = params;
 5   //邏輯集合(以下划線開頭的變量表示私有,外部不應調用)
 6   this._logics = [];
 7   //定義核心執行接口
 8   this._exec = function(){
 9     var list = [];
10     //遍歷整數
11     for(var i=1;i<=max;i++){
12       var buffer = "";
13       //遍歷特殊數
14       for(var j=0;j<params.length;j++){
15         var _j = params[j];
16         //遍歷規則
17         for(var k=0;k<_j.rules.length;k++){
18           var _k = _j.rules[k];
19           var result = this._logics[_k](i,_j);
20           if(result != null){
21             buffer += result;
22             break;
23           }
24         }
25       }
26       //填入列表
27       if(buffer){
28         list.push(buffer);
29       }else{
30         list.push(i);
31       }
32     }
33     
34     return list;
35   };
36 }
37 
38 //定義輸出接口
39 fbw.prototype.getFBW = function(){
40   //1.重新組織邏輯集合
41   this._logics = [];
42   //規則中參數統一:n目標數,o特殊數對象
43   //規則4(實際上第三條和第四條可以統一到規則4)
44   this._logics[4] = function(n,o){
45     if(n % o.number == 0){
46       return o.name;
47     }else{
48       return null;
49     }
50   }
51   //規則5
52   this._logics[5] = function(n,o){
53     if(n.toString().indexOf(o.number.toString())>=0){
54       return o.name;
55     }else{
56       return null;
57     }
58   }
59   
60   //2.調用核心執行接口
61   return this._exec();
62 };
View Code

 

 

fbw.html

 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4     <title>FizzBuzzWhizz - By YangYuan</title>
 5     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7   </head>
 8   <body>
 9     <!-- 結果列表 -->
10     <textarea id="fbwText" rows="30" cols="20"></textarea>
11   
12   <script src="js/fbw.js"></script>
13   <script>
14     //實例化
15     var f = new fbw(100,
16       [{
17         //特殊數
18         number: 3,
19         //特殊數代表的名稱
20         name: "Fizz",
21         //規則列表,如果前邊的規則一旦匹配,將忽略后邊的規則
22         rules: [5,4]
23       },{
24         number: 5,
25         name: "Buzz",
26         rules: [4]
27       },{
28         number: 7,
29         name: "Whizz",
30         rules: [4]
31       }]
32     );
33     
34     //獲取結果
35     var list = f.getFBW();
36     
37     //顯示到頁面
38     for(var i in list){
39       document.getElementById("fbwText").value = 
40                                                 document.getElementById("fbwText").value + 
41                                                 "\n" + 
42                                                 list[i];
43     }
44   </script>
45   </body>
46 </html>
View Code

 

 

運行效果:

 

 

     博客里看的不爽,可以直接打包下載:下載地址

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM