好久沒來簡書寫東西了,賬號都自動登出了。。(尷尬臉)。。
最近一直在刷Ruby Koans(安利臉),翻著鎬頭書(安利臉 ps:絕版了,不過有英文第三版),逛著stackoverflow,嗯,這就是生活。
廢話不多說,看題:
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"
]
分析
題目很簡單,生成一個字符串?dāng)?shù)字?jǐn)?shù)組,其中3和5的倍數(shù)被相應(yīng)字符串替換。那就一步一步來吧:
- 生成一個字符串?dāng)?shù)字?jǐn)?shù)組:
datas=("1"..n.to_s).to_a
("1"..n.to_s)是生成一個從"1"到"n"的Range,然后調(diào)用to_a方法轉(zhuǎn)換成Array
- 將數(shù)組中3的倍數(shù)用字符串“Fizz”替換:
(2.. datas.size()-1).step(3).each do |i|
datas[i]="Fizz"
end
(2.. datas.size()-1).step(3)以3為間隔生成一個Range,用作datas中索引3的倍數(shù)的元素,在block中修改這些元素的值為“Fizz”
- 將數(shù)組中5的倍數(shù)用字符串“Buzz”替換:
(4.. datas.size()-1).step(5).each do |i|
datas[i]= "Buzz"
end
- 將數(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
備注
剛開始接觸這個題下意識以為是考察如何替代求余運(yùn)算來提高效率。。。too young啊,又掉進(jìn)c坑里去了。
所以說,有沒有更高效率的寫法,有,看看Runtime Distribution就知道有,可是真的需要么?剛開始我用C++實(shí)現(xiàn)就一直在考慮效率,輕松跑到4ms左右又換成golang來寫,同樣的優(yōu)化方法(利用三次循環(huán)減少條件判斷而不是一次循環(huán)多次判斷,當(dāng)n非常大的時候減少條件判斷意味著減少分支預(yù)測,也就意味著性能提升),結(jié)果卻不是那么明顯。也許,leetcode的測試用例太少了;也許,高級語言本身的損耗高于代碼結(jié)構(gòu)帶來的損耗;也許,我的某一次提交運(yùn)行的時候,機(jī)器正在生孩子負(fù)載太重了。太多的也許,讓我想起鎬頭書里孟巖在推薦序中的一句話:
面對執(zhí)行性能與開發(fā)效率的謎題,Ruby毫不猶豫的選擇了開發(fā)效率,選擇了對人腦友好
所以,我不打算繼續(xù)糾結(jié)于性能(′▽`)