最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏

最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

最近的互联网招聘平台拉勾网在五月推出了“最艰难的采访IT公司”码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks、Google、Unisys、Rackspace、Cypress Semiconductor。

每一个公司联合拉勾网推出代码挑战,针对每一个挑战都能够提交我们自己的代码。假设通过代码測试。就会在后面几天收到相关公司的笔试、面试邀请,这些都不多说了,感兴趣的能够去官网看看。这些题目简约而不简单,也就是看上去十分的简单。可是做到尽善尽美难能可贵,这就是为什么面试难的原因。给你的题目很easy,你自以为写的很正确但终于还是被刷,似乎莫名其妙。事实上你的代码漏洞百出。

 

比方ThoughtWorks推出的第一道代码挑战题例如以下:


  
  

你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:

1. 你首先说出三个不同的特殊数,要求必须是个位数,比方3、5、7。 2. 让全部学生拍成一队,然后按顺序报数。

3. 学生报数时,假设所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz;假设所报数字是第二个特殊数(5)的倍数,那么要说Buzz;假设所报数字是第三个特殊数(7)的倍数,那么要说Whizz。
4. 学生报数时,假设所报数字同一时候是两个特殊数的倍数情况下,也要特殊处理,比方第一个特殊数和第二个特殊数的倍数,那么不能说该数字,而是要说FizzBuzz, 以此类推。

假设同一时候是三个特殊数的倍数,那么要说FizzBuzzWhizz。

5. 学生报数时。假设所报数字包括了第一个特殊数,那么也不能说该数字。而是要说对应的单词。比方本例中第一个特殊数是3,那么要报13的同学应该说Fizz。假设数字中包括了第一个特殊数,那么忽略规则3和规则4,比方要报35的同学仅仅报Fizz,不报BuzzWhizz。

 
如今,我们须要你完毕一个程序来模拟这个游戏,它首先接受3个特殊数,然后输出100名学生应该报数的数或单词。比方,
 
输入
3,5,7
输出(片段)
1 2 Fizz 4 Buzz Fizz Whizz 8 Fizz Buzz 11 Fizz
Fizz Whizz FizzBuzz 16 17 Fizz 19 Buzz  …
一直到100

 
嗯,看上去十分简单的一道输出题,没涉及到什么重要的算法,纯考大家的思维缜密,作为菜鸟,我也看不透这里面蕴含了什么陷阱或技巧。
我的一般思路就是(相信大多数都是这个思路):
1. 针对输入有两个要求须要满足:
  • 三个数都是个位数。这里也没说是否包括0(0难道不是个位数?),并且这三个个位数并不一定是素数(质数),因此在推断倍数时要小心,不能对三个数的乘积直接求余。
  • 三个数都必须互不同样。

2. 对于报数条件,我们应该逆序处理,比方先推断条件5。再推断条件4,4里面也要逆序,先推断是否同一时候是三个特殊数的倍数。最后推断条件3,都不满足直接输出该数字,流程例如以下(如果当前数是n。三个数各自是num1。num2,num3):

  • 假设n中包括了num1,则直接输出“Fizz”。这里怎样用程序推断一个整数是否包括一个数字或许也是个考查点,我用Java写的,为了简单,直接将n转换为String然后使用indexOf推断。
  • 假设n同一时候是num1, num2和num3的倍数,则输出“FizzBuzzWhizz”。假设是num1和num2的倍数,则输出“FizzBuzz”,假设是num2和num3的倍数。则输出“BuzzWhizz”,假设是num1和num3的倍数。则输出“FizzWhizz”。

    否则,就推断是否是单个num1或num2或num3的倍数,假设是就输出对应的字符串。

  • 假设上面都不满足,则直接输出n就可以。

这种思路敲代码就很的简单,例如以下(这是反例,是大多数人都会写的代码,相信也是ThoughtWorks公司最不想看到的代码):

import java.util.Scanner;

public class FizzBuzzWhizz {

    /**
     * @brief FizzBuzzWhizz game.
     */
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int num1 = in.nextInt();
        int num2 = in.nextInt();
        int num3 = in.nextInt();

        while (num1 <= 0 || num1 >= 10 || num2 <= 0 || num2 >= 10 
                || num3 <= 0 || num3 >= 10 || num1 == num2 || num2 == num3
                || num1 == num3) {
            System.out.println("These three digits must be between 1 and 9 and also" +
                    "be different with each other, please input again.");
            num1 = in.nextInt();
            num2 = in.nextInt();
            num3 = in.nextInt();
        }
        
        for(int n = 1; n <= 100; n++) {
            if(String.valueOf(n).indexOf(num1 + 48) != -1)
                System.out.println("Fizz");
            else if(n % num1 == 0 && n % num2 == 0 && n % num3 == 0)
                System.out.println("FizzBuzzWhizz");
            else if(n % num1 == 0 && n % num2 == 0 )
                System.out.println("FizzBuzz");
            else if(n % num2 == 0 && n % num3 == 0)
                System.out.println("BuzzWhizz");
            else if(n % num1 == 0 && n % num3 == 0)
                System.out.println("FizzWhizz");
            else if(n % num1 == 0)
                System.out.println("Fizz");
            else if(n % num2 == 0)
                System.out.println("Buzz");
            else if(n % num3 == 0)
                System.out.println("Whizz");
            else
                System.out.println(n);
        }
    }
}

 

当然不是一个.java文件提交上去就能够了,为了体现严谨性,你还须要写环境说明、执行说明、单元測试等等。单元測试挺重要,能写出什么样的測试用例也能反映出你思维的缜密性。比方这里至少包含下面几个測试用例:

  • 输入中有负数、有0、有大于10的数、有相等的数,这时候的处理是所有重输还是不符合条件的重输。我这里选择的是所有重输。
  • 输入所有为素数、所有为合数、部分素数部分合数,体现你没有误解题目意思是全素数。

 

这是我也可能是大多数人一股脑的想法,当然题目本身没有这么简单,肯定还有很多我没有考虑到的地方。这里仅仅是提供一个反例。

大家先别骂我的代码或骂这些公司出的这些题目。肯定有他们自己的道理,或许等我们看到大牛针对这种需求写出不到10行的代码且复杂度最低,或许我们就知道原来他们想要的是这种代码。

欢迎大家提出自己的宝贵意见和更好更轻的代码或想法,共同探讨这些大公司究竟想要考我们什么东西。

 

——————————————————————

更新:感谢网友@mringg提供了一个更简洁的代码,依据需求,全然不必按部就班的像我那样。例如以下的推断更好:

for(int n = 1; n <= 100; n++) {
    flag = true;
    if(String.valueOf(n).indexOf(num1 + 48) != -1) {
        System.out.println("Fizz");
        continue;
    }
    if(n % num1 == 0) {
        System.out.print("Fizz");
        flag = false;
    }
    if(n % num2 == 0) {
        System.out.print("Buzz");
        flag = false;
    }
    if(n % num3 == 0) {
        System.out.print("Whizz");
        flag = false;
    }
    
    if(flag)
        System.out.print(n);
    System.out.println();
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117475.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 常用的web漏洞扫描工具_十大常用管理工具

    常用的web漏洞扫描工具_十大常用管理工具Webscantool推荐10大Web漏洞扫描程序Nikto这是一个开源的Web服务器扫描程序,它可以对Web服务器的多种项目(包括3500个潜在的危险文件/CGI,以及超过900个服务器版本,还有250多个服务器上的版本特定问题)进行全面的测试。其扫描项目和插件经常更新并且可以自动更新(如果需要的话)。Nikto可以在尽可能短的周期内测试你的Web服务器,这在其日志文件中…

    2022年9月12日
    5
  • 11.1 LAMP架构介绍11.2 MySQL_MariaDB介绍11.3-11.5 MySQL安装

    11.1 LAMP架构介绍11.2 MySQL_MariaDB介绍11.3-11.5 MySQL安装

    2022年3月11日
    45
  • Java知识体系最强总结(2021版)[通俗易懂]

    更新于2019-12-1510:38:00本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章目录…

    2022年4月6日
    49
  • 网络天才网页版在线玩无需下载(中国破解网络的天才)

    网络天才这是一款解谜问答类的娱乐游戏,用独具色彩的画面风格,以阿拉丁为故事背景,可以用几个问题来猜出你心中所想,并体验多种思维导向与解谜挑战,非常适合闲暇时间里休闲娱乐一下。感兴趣的快来下载吧!游戏特色释放你的创造力由于Geniz,你可以解锁,并玩转新的背景,随意定制Akinator。这个精灵将变成一个吸血鬼、牛仔或迪斯科舞者。继续猜每天尝试找出5个神秘人物,赢得特别的天才,用来定制你最喜欢的妖怪…

    2022年4月18日
    5.6K
  • Pytest(5)美化插件进度条pytest-sugar[通俗易懂]

    Pytest(5)美化插件进度条pytest-sugar[通俗易懂]前言在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别。有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点。

    2022年7月30日
    8
  • 华为悦盒ec6108v9a怎么刷机_华为悦盒官方固件

    华为悦盒ec6108v9a怎么刷机_华为悦盒官方固件华为悦盒EC6108V9A一、产品型号二、工具准备与资料下载1.[当贝网站教程及工具下载](https://www.znds.com/jc/article/7020-1.html)(此网站的工具可以用,但当贝的教程极其混乱,仅供动手者参考)2.固件路径三、刷机教程1.进入盒子的Androidsystemrecovery<3e>2.清除数据3.选择Applyupdatefromexternalstorage四、盒子默认密码五、常用应用一、产品型号名称型号华为悦

    2025年7月14日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号