【问题标题】:FizzBuzz ConundrumFizzBu​​zz 难题
【发布时间】:2018-07-18 20:19:28
【问题描述】:

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

  • 这个著名问题背后的逻辑是什么?
  • 当面试官问这个问题时,他们在候选人身上寻找什么?
  • 我们知道如何编写基本代码吗?
  • 他们想看看我们的编码风格吗?
  • 他们是否期望在这个问题上进行优化?很难尝试优化代码。

这是一个数学方法:

如果循环计数 = 100

%15 计算 = 100

%3 计算 = 100 - 6 = 94

%5 计算 = 100 - 33 = 67

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

【问题讨论】:

    标签: logic fizzbuzz


    【解决方案1】:

    最近在面试中被问到这个问题,我没有花太多时间思考,只是写了一个简单的java方法,它接受整数并返回适当的Fizz Buzz单词,我问了面试官这个问题,预期是什么程序发生了变化,他说另一个条件,比如可以被 7 整除的数字 print 'SEVEN' 所以我进行了一些重构,最终答案如下所示

     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));
    }
    

    我可以看到面试官对解决方案印象深刻。 在我看来,尽可能多地与面试官互动,并尝试了解他到底要检查什么。

    【讨论】:

    • 这是一个很酷的方法,谢谢你的解决方案:D 在 java 8 中,我了解到它可以在 4-5 行中完成。
    【解决方案2】:

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

    真正要淘汰那些不知道自己在做什么的人。

    当面试官问这个问题时,他们在候选人身上寻找什么?

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

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

    是的,条件;循环;运营商

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

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

    他们期待这个问题的优化吗?

    这取决于,我认为if elseif 和不同的循环方式组合在一起。通常,每个面试官都应该对这个问题提出自己的看法。例如,在 C# 中,我会将我的测试设置为包含一个内存管理元素,期望为 yield return

    您可能想阅读 Jeff Atwood 的 post on the topic

    【讨论】:

    • 感谢您的回答。我想重新问这个问题,因为您提出了关于 %15 的观点,是使用“%(5*3)”还是“%3 && %5”而不是前者?
    • @shd293 他们只是不同,在一次采访中我只想问你为什么选择以一种方式而不是另一种方式来做。真的没有正确或错误的答案。您可以说%15 更有效,因为您只检查一个条件。
    猜你喜欢
    • 2012-11-04
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2016-01-15
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多