Logic 泡沫之谜

Logic 泡沫之谜,logic,fizzbuzz,Logic,Fizzbuzz,FizzBuzz问题是一个非常经典的面试问题,在世界各地的多次面试中都会被问到。用不同的语言有很多方法。但在大多数情况下,它肯定涉及到使用3或4个if/else if循环。如果我们进入Java8领域,有很多奇妙的方法可以做到这一点。但我的主要问题是: 这个著名问题背后的逻辑是什么 当面试官问这个问题时,他们想从应聘者身上寻找什么 我们知道如何编写基本的代码吗 他们想看看我们的编码风格吗 他们是否期望在这个问题上得到优化?很难尝试并优化代码 这里有一个数学观点: 如果循环计数=100 %15计

FizzBuzz问题是一个非常经典的面试问题,在世界各地的多次面试中都会被问到。用不同的语言有很多方法。但在大多数情况下,它肯定涉及到使用3或4个if/else if循环。如果我们进入Java8领域,有很多奇妙的方法可以做到这一点。但我的主要问题是:

  • 这个著名问题背后的逻辑是什么
  • 当面试官问这个问题时,他们想从应聘者身上寻找什么
  • 我们知道如何编写基本的代码吗
  • 他们想看看我们的编码风格吗
  • 他们是否期望在这个问题上得到优化?很难尝试并优化代码
这里有一个数学观点:

如果循环计数=100

%15计算=100

%3计算=100-6=94

%5计算=100-33=67

总模量计算=261(100+94+67)

这个著名问题背后的逻辑是什么

真正的做法是剔除那些不知道自己在做什么的人

当面试官问这个问题时,他们想从应聘者身上寻找什么

最重要的是,对我来说,这是一个对话的开始。例如,你可以要求人们解释他们为什么选择
x%15==0
而不是
x%3==0&&x%5==0

我们知道如何编写基本的代码吗

是的,条件;环;操作员

他们想看看我们的编码风格吗

是的,这可能是关于优化或只是对话。面试的过程是了解你面前的人。(这是双向的)

他们是否期望在这个问题上得到优化

这要看情况而定,我认为有两种方法可以组合使用:if
elseif
和不同的循环方式。通常,每个面试官都应该对这个问题有自己的见解。例如,在C#中,我会设置我的测试,以包含一个关于内存管理的元素,该元素具有
收益率
期望值


你可能想读Jeff Atwood的。

最近我在采访中被问到这个问题,我没有花太多时间思考,只是写了一个简单的java方法,它接受整数并返回适当的嘶嘶声,我向采访者问了一个问题,程序中的预期变化是什么,他说了另一个条件,比如数字可以被7整除,打印“7”,所以我进行了一些重构,最后的答案如下

 public static void main(String[] args) {

    Function<Integer,String> fizz = e->e%3==0?"FIZZ":"";
    Function<Integer,String> Buzz = e->e%5==0?"BUZZ":"";
    Function<Integer,String> fizzBuzz = e->e%3==0 && e% 5==0?"FIZZBUZZ":"";
    Function<Integer,String> seven = e->e%7==0?"SEVEN":"";
    List<Function<Integer, String>> predicateList = List.of(fizz,Buzz,fizzBuzz,seven);
    IntStream.range(0,100).boxed()
                        .map(e->applyFizzBuzzFunc(e,predicateList))
                        .forEach(System.out::println);
}

/**
 * Executes the list in the given order 
 */
private static String applyFizzBuzzFunc(Integer e, List<Function<Integer, String>> predicateList) {
    return predicateList.stream()
                        .map(f -> f.apply(e))
                        .filter(s -> !"".equals(s))
                        .findFirst()
                        .orElse(String.valueOf(e));
}
publicstaticvoidmain(字符串[]args){
函数fizz=e->e%3==0?“fizz”:“”;
函数Buzz=e->e%5==0?“Buzz”:“;
函数fizzBuzz=e->e%3==0&&e%5==0?“fizzBuzz”:”;
函数七=e->e%7==0?“七”:“;
List predicateList=List.of(嘶嘶声,嗡嗡声,嘶嘶声,七声);
IntStream.range(0100).boxed()
.map(e->applyFizzBuzzFunc(e,谓词列表))
.forEach(System.out::println);
}
/**
*按给定顺序执行列表
*/
私有静态字符串applyFizzBuzzFunc(整数e,列表谓词列表){
返回谓词列表.stream()
.map(f->f.apply(e))
.filter(s->!“”.equals)
.findFirst()
.orElse(String.valueOf(e));
}
我可以看出面试官对这个解决方案印象深刻。
在我看来,尽量与面试官互动,试着理解他到底想检查什么。

谢谢你的回答。我想再问一次,因为你提出了关于%15的观点,使用“%(5*3)”或“%3&&%5”来代替前者是正确的做法吗?@shd293它们只是不同,在一次采访中,我只想问你为什么选择一种方式而不是另一种方式。没有一个正确或错误的答案。您可以说,
%15
更有效,因为您只需检查一个条件。这是一个很酷的方法,感谢您提供的解决方案:在java 8中,我了解到它可以在4-5行中完成。