js 也來 - 【拉勾專場】拋棄簡曆!讓代碼說話!

來源:互聯網
上載者:User

標籤:style   blog   class   code   java   tar   

前些日子謝亮兄弟丟了一個連結在群裡,我當時看了下,覺得這種裝逼題目沒什麼意思,因為每種語言都有不同的實現方法,
你怎麼能說你的方法一定比其他語言的好,所以要好的思路 + 好的語言特性運用才能讓代碼升華。

題目如下:《【拉勾專場】拋棄簡曆!讓代碼說話!》

?
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

猛地一看,還以為是ACM....裡的水題,額,好吧,其實這個考點在思路,而不是結果。
因為誰都能得到這個結果,但是思路就各出奇招吧。

一開始我也沒什麼好方法,所以沒去做,今天想到個比較奇葩的方法實現的,給大家參考下。
可能其他語言根本不能這麼用,因為js語言特性,所以他在js下能得到比好的結果。算是 js only 的代碼吧。


簡單說下思路吧。

1. 先處理 1 - 100 之間 3,5,7 的倍數的值,給他們累加字串。
2. 遍曆 1 - 100,如果編號含 3 的,就直接用 Fizz 覆蓋,如果是空的返回編號,否則返回之前累加的字串。

思路簡單,直接上代碼吧:

var key = [3, 5, 7], // 特殊數字    keyStr = ["Fizz", "Buzz", "Whizz"], // 替換字元    arr = Array(101).join(",").split(","), // 初始化101個Null 字元串數組    i = 0, // 累加器    n = 1, // 倍數累加器    tmp; // 臨時變數for (; i<3; i++, n=1) { // 遍曆 key 數組    while (101 > (tmp = key[i]*n++)) { // n倍結果        arr[tmp] += keyStr[i]; // 累加字串    }}for (i=1; i<101; i++) {    arr[i] = (i+"").indexOf(key[0])>-1 ? keyStr[0] : arr[i] === ‘‘ ? i : arr[i];}arr.shift(); // 去除下標0的元素console.log(arr.join("\n"));

不到 20 行代碼,我也不知道這個 "行" 是怎麼定義的,在js裡,全部縮成一行也是OK的,對吧。

如果按 ; 分,那整理下:

var key = [3, 5, 7], keyStr = ["Fizz", "Buzz", "Whizz"], arr = Array(101).join(",").split(","), i = 0, n = 1, tmp;for (; i<3; i++, n=1) while (101 > (tmp = key[i]*n++)) arr[tmp] += keyStr[i];for (i=1; i<101; i++) arr[i] = (i+"").indexOf(key[0])>-1 ? keyStr[0] : arr[i] === ‘‘ ? i : arr[i];arr.shift();console.log(arr.join("\n"));

嗯,不錯,5行代碼,呵呵。。。

好了,不扯蛋了,只是分享下思路,不要研究10行還是5行實現的問題了,因為語言特性所致,沒辦法明確規定,思路新穎奇葩才能出彩。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.