2017-09-04 207 views
1

我有一個面試問題是讓我寫一個在Lua語言下列要求的程序:如果數字是3的倍數1之間Lua的for循環與多個條件

  • 打印號碼100
  • 如果數字是5的倍數,則打印'Fizz'而不是數字
  • 如果數字是5和3的倍數,則打印'Buzz'而不是數字
  • ,打印'FizzBu​​zz'而不是數字

我寫了下面:

for i=1,100 do 
    if i%5==0 then 
    if i%3==0 then 
     print("FizzBuzz") 
    else 
     print("Buzz") 
    end 
    elseif i%3==0 then 
    print("Fizz") 
    else 
    print(i) 
    end 
end 

反響並不好,說的代碼的質量沒有達到他們的標準。我如何才能將以上代碼改爲最高標準以供將來參考?

重新閱讀代碼後,我意識到它不易讀,所以我確信這是主要原因。也許更少的處理也可能涉及?尋找一些指導。

+0

這個問題似乎是fizbuzz問題的畸形措辭。 https://www.google.ru/search?hl=&q=fizz+buz您的代碼沒有執行上述操作(「3的倍數,打印'fizz \ 5的倍數,打印'fuzz')。對於經典問題,我猜(如果「Bizz」實際上是「Fizz」)。而面試過程並不是客觀的過程,這個決定可以由一個來自互聯網的隨機人員來解釋。 – Dimitry

+0

@Dimitry啊,感謝fizbuzz問題的背景資料,我其實不知道這是一個受歡迎的面試篩選過程。 Bizz是一個錯字,你說得對,它實際上就是Fizz。關於這個問題,它是指代碼本身,而不是訪談。我將它發佈在代碼審查部分,以查看代碼是否可以改進,而不是輸入錯誤。 –

+0

也許更適合https://codereview.stackexchange.com。 – lhf

回答

1

很難說出這個人詢問的內容,但是有幾種方法可以使代碼更短或更少重複。例如,你可以修改它只需檢查i%3一次(與感實性檢查所增加的成本),降低print調用次數:

for i=1,100 do 
    local s = i%3==0 and "Fizz" 
    if i%5==0 then s = (s or "") .. "Buzz" end 
    print(s or i) 
end 

您也可包括在第二如果到print

for i=1,100 do 
    local s = i%3==0 and "Fizz" 
    print(i%5==0 and (s or "") .. "Buzz" or s or i) 
end 

它絕對更短,但有人可能會爭辯說它不具有更好的可讀性。

您也可避免級聯使用FizzBuzz

for i=1,100 do 
    local s = i%3==0 and "Fizz" 
    print(i%5==0 and (s and "FizzBuzz" or "Buzz") or s or i) 
end 

在實際的採訪中,你可以問我,他們會想提高哪些方面的條款。我認爲使用print更少的時間是合乎邏輯的步驟,但除此之外,我希望他們指定他們是否更關心清晰度,簡潔性,速度或其他。

我也跑所有4個代碼片段(原始的一個+ 3中所示)與print通過簡單地存儲在變量中的值,並且在這裏所取代是結果(運行循環億倍和定時使用的Lua 5.3 os.clock):

9.515 
10.797 
10.672 
10.047 

也有可能,他們只是希望你能檢查15,5,3:

for i=1,100 do 
    print(i%15==0 and "FizzBuzz" or i%3==0 and "Fizz" or i%5==0 and "Buzz" or i) 
end 
+0

感謝您的全面回答,這將有助於我在未來和我的思維方式。時間是否會導致訂單,我的答案是第一位的,以及您提交的三種可能的答案是按照您提供的順序提供的? –

+1

是的,時間結果的順序與示例的順序相同,您的原始代碼是第一個(將「print」調用替換爲同一局部變量的賦值)。 –

1

IMO,最清晰的代碼將是如下:

for n = 1, 100 do 
    local s = (n%3 == 0 and 'Fizz' or '')..(n%5 == 0 and 'Buzz' or '') 
    print(s == '' and n or s) 
end 
+1

我會將最後一行改爲'print(s>''和s或n)',不是因爲它更短,而是因爲它不需要從's'切換到'n'並且返回到's '。 –

+1

你的意思是「心理轉換」?沒有「技術開關」在這裏(即,字節碼是幾乎相同) –

+1

是,「心理開關」;) –

1

對於我來說,最清晰的代碼是

for i=1,100 do 
    if i%15==0 then 
    print("FizzBuzz") 
    elseif i%3==0 then 
    print("Fizz") 
    elseif i%5==0 then 
    print("Buzz") 
    else 
    print(i) 
    end 
end 

我猜他們不喜歡你重複測試i%3==0。上述

的代碼依賴於我們能夠表達A(i) and B(i)簡潔。我想,在一般情況下,你不得不做這樣的事情,這是明確的,避免了重新計算謂詞:

for i=1,100 do 
    local a=A(i) 
    local b=B(i) 
    if a and b then 
    print("FizzBuzz") 
    elseif a then 
    print("Fizz") 
    elseif b then 
    print("Buzz") 
    else 
    print(i) 
    end 
end 
+0

尼斯操作:'I%== 3' :-) –

+0

@EgorSkriptunoff,哎呀,謝謝! – lhf

+0

我有一種直接將需求轉換爲代碼的習慣,這就是爲什麼我沒有使用15.雖然結果是相同的,但需求沒有提到15,所以我完全忽略了它。就我而言,如果這是原因,我需要改變我的習慣。感謝您的提示,它將在未來幫助我。 –