2017-09-04 163 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,所以我完全忽略了它。就我而言,如果这是原因,我需要改变我的习惯。感谢您的提示,它将在未来帮助我。 –