Fizz Buzz的Ruby實(shí)現(xiàn)

好久沒(méi)來(lái)簡(jiǎn)書(shū)寫(xiě)東西了,賬號(hào)都自動(dòng)登出了。。(尷尬臉)。。

最近一直在刷Ruby Koans(安利臉),翻著鎬頭書(shū)(安利臉 ps:絕版了,不過(guò)有英文第三版),逛著stackoverflow,嗯,這就是生活。

廢話不多說(shuō),看

Write a program that outputs the string representation of numbers from 1 to n.
But for multiples of three it should output “Fizz” instead of the number and for the multiples of five output “Buzz”. For numbers which are multiples of both three and five output “FizzBuzz”.
Example:

n = 15,
Return:
[
    "1",
    "2",
    "Fizz",
    "4",
    "Buzz",
    "Fizz",
    "7",
    "8",
    "Fizz",
    "Buzz",
    "11",
    "Fizz",
    "13",
    "14",
    "FizzBuzz"
]

分析

題目很簡(jiǎn)單,生成一個(gè)字符串?dāng)?shù)字?jǐn)?shù)組,其中3和5的倍數(shù)被相應(yīng)字符串替換。那就一步一步來(lái)吧:

  1. 生成一個(gè)字符串?dāng)?shù)字?jǐn)?shù)組
datas=("1"..n.to_s).to_a

("1"..n.to_s)是生成一個(gè)從"1""n"Range,然后調(diào)用to_a方法轉(zhuǎn)換成Array

  1. 將數(shù)組中3的倍數(shù)用字符串“Fizz”替換:
(2.. datas.size()-1).step(3).each do |i|
        datas[i]="Fizz"
    end

(2.. datas.size()-1).step(3)以3為間隔生成一個(gè)Range,用作datas中索引3的倍數(shù)的元素,在block中修改這些元素的值為“Fizz”

  1. 將數(shù)組中5的倍數(shù)用字符串“Buzz”替換:
(4.. datas.size()-1).step(5).each do |i|
        datas[i]= "Buzz"
    end
  1. 將數(shù)組中15的倍數(shù)用字符串“FizzBuzz”替換:
(14.. datas.size()-1).step(15).each do |i|
        datas[i]= "FizzBuzz"
    end

最后,整體源碼如下:

# @param {Integer} n
# @return {String[]}
def fizz_buzz(n)
    datas=("1"..n.to_s).to_a
    (2.. datas.size()-1).step(3).each do |i|
        datas[i]="Fizz"
    end
    (4.. datas.size()-1).step(5).each do |i|
        datas[i]= "Buzz"
    end
    (14.. datas.size()-1).step(15).each do |i|
        datas[i]= "FizzBuzz"
    end     
    return datas
end

備注

剛開(kāi)始接觸這個(gè)題下意識(shí)以為是考察如何替代求余運(yùn)算來(lái)提高效率。。。too young啊,又掉進(jìn)c坑里去了。
所以說(shuō),有沒(méi)有更高效率的寫(xiě)法,有,看看Runtime Distribution就知道有,可是真的需要么?剛開(kāi)始我用C++實(shí)現(xiàn)就一直在考慮效率,輕松跑到4ms左右又換成golang來(lái)寫(xiě),同樣的優(yōu)化方法(利用三次循環(huán)減少條件判斷而不是一次循環(huán)多次判斷,當(dāng)n非常大的時(shí)候減少條件判斷意味著減少分支預(yù)測(cè),也就意味著性能提升),結(jié)果卻不是那么明顯。也許,leetcode的測(cè)試用例太少了;也許,高級(jí)語(yǔ)言本身的損耗高于代碼結(jié)構(gòu)帶來(lái)的損耗;也許,我的某一次提交運(yùn)行的時(shí)候,機(jī)器正在生孩子負(fù)載太重了。太多的也許,讓我想起鎬頭書(shū)里孟巖在推薦序中的一句話:

面對(duì)執(zhí)行性能與開(kāi)發(fā)效率的謎題,Ruby毫不猶豫的選擇了開(kāi)發(fā)效率,選擇了對(duì)人腦友好

所以,我不打算繼續(xù)糾結(jié)于性能(′▽?zhuān)?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文地址:http://joelgrus.com/2016/05/23/fizz-buzz-in-tensorfl...
    MachineLP閱讀 1,700評(píng)論 0 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • clojure 新手指南-目錄 - climbdream的個(gè)人空間 - 開(kāi)源中國(guó)社區(qū)https://my.osch...
    葡萄喃喃囈語(yǔ)閱讀 2,506評(píng)論 0 3
  • 數(shù)組在程序設(shè)計(jì)中,為了處理方便, 把具有相同類(lèi)型的若干變量按有序的形式組織起來(lái)。這些按序排列的同類(lèi)數(shù)據(jù)元素的集合稱(chēng)...
    朱森閱讀 4,283評(píng)論 2 13
  • 九寨風(fēng)情美, 湖光映彩林。 巖灘飛瀑布, 觀水動(dòng)人心。 注:以上圖片均為作者手機(jī)隨拍
    文貝閱讀 378評(píng)論 10 33

友情鏈接更多精彩內(nèi)容