1. 程式人生 > >【拉勾專場】拋棄簡歷!讓程式碼說話!

【拉勾專場】拋棄簡歷!讓程式碼說話!

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

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個空字串陣列
    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行實現的問題了,因為語言特性所致,沒辦法明確規定,思路新穎奇葩才能出彩。

 

 剛才在開源中國看到一位大神8行實現,FizzBuzzWhizz,比我思路好多了,我簡單修改了下,去掉了所有 if 語句,程式碼展開狀態10行:

function cd(x, y, s) {
    return x % y === 0 ? s : '';
}
function bs(a, b, c) {
    for (var i = 1; i <= 100; i++) {
        var d = cd(i, a, 'Fizz') + cd(i, b, 'Buzz') + cd(i, c, "Whizz");
        console.log((i + "").indexOf(a) !== -1 ? "Fizz" : d !== '' ? d : i);
    }
}
bs(3, 5, 7);

只有想不到,沒有做不到,我會繼續收集js版FizzBuzzWhizz神思路的。

相關推薦

專場拋棄簡歷程式碼說話

前些日子謝亮兄弟丟了一個連結在群裡,我當時看了下,覺得這種裝逼題目沒什麼意思,因為每種語言都有不同的實現方法,你怎麼能說你的方法一定比其他語言的好,所以要好的思路 + 好的語言特性運用才能讓程式碼昇華。 FizzBuzzWhizz 你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞一個遊

Java開發者專場阿里專家樑笑:2018雙十一下單成功率99.9%供應鏈服務平臺如何迎接大促

本篇文章來自於2018年12月22日舉辦的《阿里雲棲開發者沙龍—Java技術專場》,樑笑專家是該專場第一位演講的嘉賓,本篇文章是根據樑笑專家在《阿里雲棲開發者沙龍—Java技術專場》的演講視訊以及PPT整理而成。 摘要:2018年雙十一平穩度過,海量訂單、零點流量高峰,阿里是如何實現供應鏈99.9%的下

演算法與資料結構專場BitMap演算法基本操作程式碼實現

上篇我們講了BitMap是如何對資料進行儲存的,沒看過的可以看一下【演算法與資料結構專場】BitMap演算法介紹 這篇我們來講一下BitMap這個資料結構的程式碼實現。 回顧下資料的儲存原理 一個二進位制位對應一個非負數n,如果n存在,則對應的二進位制位的值為1,否則為0。這個時候,我們的第一個問題:我們在

struts2錯誤整合配置過程中各種的錯誤

     菜鳥一隻,在初步學習struts2時,第一步就是要配置,關於如何配置,我這裡就不多做描述,網上有很多教程。      我大概說下要的步驟:      1.下載struts2的壓縮包      2.建立新專案      3.匯入jar包      4.建立s

移動端佈局拋棄rem,使用vw

你還在用rem彈性佈局嗎?在html檔案頭部放入一大段壓縮過的js程式碼,是不是讓你很難受?來了解下vw吧,能讓你的程式碼更純粹 簡單介紹下rem佈局方案 rem是css中的長度單位,1rem=根元素html的font-size值。當頁面中所有元素都使用re

Java開發者專場阿里專家墨玖:淘票票工程師文化

本篇文章來自於2018年12月22日舉辦的《阿里雲棲開發者沙龍—Java技術專場》,墨玖專家是該專場第二位演講的嘉賓,這篇文章是將墨玖專家在《阿里雲棲開發者沙龍—Java技術專場》當中演講進行文字化。 摘要:談到工程師文化,大家都會比較熟悉,或者比較嚮往。但是到底什麼是工程師文化,應該怎麼做是網際網

Java開發者專場阿里特邀專家徐雷:Java為王,網際網路高併發架構設計選型之路

本篇文章來自於2018年12月22日舉辦的《阿里雲棲開發者沙龍—Java技術專場》,徐雷專家是該專場第三位演講的嘉賓,本篇文章是根據徐雷專家在《阿里雲棲開發者沙龍—Java技術專場》的演講視訊以及PPT整理而成。 摘要:Java從誕生以來幾乎一直是排名第一的語言,長期霸榜。在架構師成長道路中,學習Ja

Java開發者專場阿里專家杜萬:Java響應式程式設計,一文全面解讀

本篇文章來自於2018年12月22日舉辦的《阿里雲棲開發者沙龍—Java技術專場》,杜萬專家是該專場第四位演講的嘉賓,本篇文章是根據杜萬專家在《阿里雲棲開發者沙龍—Java技術專場》的演講視訊以及PPT整理而成。 摘要:響應式宣言如何解讀,Java中如何進行響應式程式設計,Reactor Stream

移動端佈局拋棄rem,使用vw 移動端佈局拋棄rem,使用vw

【移動端佈局】拋棄rem,使用vw 簡單介紹下rem佈局方案 rem是css中的長度單位,1rem=根元素html的font-size值。當頁面中所有元素都使用rem單位時,你只需要改變根元素font-size

Python小白向PyPI上傳程式碼出現問題,報401或者410如何解決(主要是上傳的URL不正確)

參考:《Head First Python》向PyPI上傳程式碼一章節環境:Win7+Python3.5      作為一個剛接觸Python的一名小白,在閱讀《Head First Python》向PyPI上傳程式碼一章節時,上傳遇見了URL不對,各種度娘,發現沒有太多關於

震撼來襲MyEclipse 2017 CI 1正式釋出

MyEclipse 2017 CI 1正式釋出。MyEclipse 2017 CI 1是基於Eclipse Neon的第一個版本,通過更新產品的軟體整合,新增對Angular 2支援並改進TypeScript等,從而使MyEclipse更加智慧。下面一起來看詳細更新:

offer收割機必備簡歷上的Java專案都好low,怎麼辦?

開發十年,就只剩下這套架構體系了! >>>   

重榜?.NET 6 Preview 1 開箱上手帶你嘗試新版本更新

[TOC] 最近 .NET 6 Preview 1 釋出了,.NET 統一是此版本的核心。大家可以讀一下原文部落格: https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/ .NET 6.0 SDK 和 Runtime 下載地址:

軟件測試-如何做一個開發人員看得起的測試人員

是否 sci 生產 安全 經理 一段 學習 語言 加密傳輸 以下文章來自一個測試人員感想大家可以看看。 做測試做了8年,前兩年做的是與硬件產品相關的測試,質量管理比軟件行業要嚴格的多的多,原因是,大部分的應用軟件代碼出錯,改下代碼重新編譯,打補丁,就ok了,而一旦硬件設計出

機器學習筆記:一文你徹底理解準確率,精準率,召回率,真正率,假正率,ROC/AUC

作者:xiaoyu 微信公眾號:Python資料科學 非經作者允許,禁止任何商業轉載。 ROC/AUC作為機器學習的評估指標非常重要,也是面試中經常出現的問題(80%都會問到)。其實,理解它並不是非常難,但是好多朋友都遇到了一個相同的問題,那就是:每次看書的時候

Unity&UGUI&Shader建立材質球Material&程式碼控制更換物體材質球

UGUI(Unity Graphical User Interface 簡稱 UGUI,又稱圖形使用者介面)如何建立材質球 NGUI(Next-generation GUI,下一代圖形使用者介面) Assets--Create--Material如下圖所示 點選建立好

JS設計模式責任鏈模式的程式碼示例

責任鏈設計模式:在責任鏈模式裡,很多物件由每一個物件對其下家的引用而連線起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個物件最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。責任鏈模

LEOS嵌入式工作室邏輯的發明這個世界逐漸的清晰了起來,同時也給每一件事物包裹了層層的語法糖衣,在浩瀚的知識海洋中徜徉,我們逐漸失去了對事物內在的感觸,而浮在了一切事物的表面。在機器的世界裡只有一大堆的0和1,而在龐大的數字之上便是人賦予給它的無限意

邏輯的發明讓這個世界逐漸的清晰了起來,同時也給每一件事物包裹了層層的語法糖衣,在浩瀚的知識海洋中徜徉,我們逐漸失去了對事物內在的感觸,而浮在了一切事物的表面。在機器的世界裡只有一大堆的0和1,而在龐大... (adsbygoogle = window.ad

Mask R-CNN(八):程式碼理解demo.ipynb

首先,匯入包。 import os import sys import random import math import numpy as np import skimage.io import matplotlib import matplotlib.pyplot as

演講與口才(2)觀眾感同身受

音訊:http://readooapi.youshu.cc/Activity/ReadPlanActivity?code=86_10212 為什麼說演講是一件很挑戰自我的事情? 相信很多人都有過類