最近的互联网招聘平台拉勾网在五月推出了“最艰难的采访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();
}

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

最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏的更多相关文章

  1. ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#)

    最早看到这个题目是从@ 程序媛想事儿(Alexia) 的 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏 开始的,然后这几天陆陆续续有N个小伙伴发表了自己的文章 ...

  2. 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏

    最近互联网招聘平台拉勾网在五一期间推出个“最难面试的IT公司”代码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspace.Cypress ...

  3. 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)

    原题 看到那么多人看到前面这么糟粕的代码各种不忍直视后,楼主还是把最终实现放在页首吧.             Console.WriteLine("说出三个不同的特殊数,用','隔开 &q ...

  4. ThoughtWorks代码挑战——FizzBuzzWhizz

    很久没发表过文章了,今天看到一篇文章 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法) 看到LZ的2B青年代码,实在是惨不忍睹,故写篇文章来探讨下这类 ...

  5. Google 公司的代码规范

    如题: C++ , Objective-C, Java, Python, R, Shell, HTML/CSS, JavaScript, AngularJS, Common Lisp ,Vimscri ...

  6. Qt侠:像写诗一样写代码,玩游戏一样的开心心情,还能领工资!

    [软]上海-Qt侠 2017/7/12 16:11:20我完全是兴趣主导,老板不给我钱,我也要写好代码!白天干,晚上干,周一周五干,周末继续干!编程已经深入我的基因,深入我的骨髓,深入我的灵魂!当我解 ...

  7. python 爬虫 requests+BeautifulSoup 爬取巨潮资讯公司概况代码实例

    第一次写一个算是比较完整的爬虫,自我感觉极差啊,代码low,效率差,也没有保存到本地文件或者数据库,强行使用了一波多线程导致数据顺序发生了变化... 贴在这里,引以为戒吧. # -*- coding: ...

  8. wchar_t内置还是别名?小问题一则(升级公司以前代码遇到的问题)

    问题: 原来的2008工程用2010编译后,运行程序出现无法定位程序输入点 *@basic_string@_WU@*和*@basic_string@G@* 解决: 关闭“语言选项”中“将WChar_t ...

  9. 某公司git代码管理,到如何上线

随机推荐

  1. 低版本的 opencv库的 vs2010 打开 高版本opencv

    打开track.vcxproj文件, 注释掉跟版本有关的行就可. 本例子中,当用双击.sln用vs2010打开高版本的opencv项目时,会出现错误, 并且会有错误信息提示,双击该错误信息,就会打开该 ...

  2. JqGrid 显示表

    JqGrid 下表显示了前台图书馆.使用起来非常方便. 我在这里分享使用中遇到的问题及解决方案 ** 一.rowNum属性 ** 1.假设不设置,默认显示数是20,也就是说超过20以后的数据.不再显示 ...

  3. OpenStack安装与配置2

    第二部分 OpenStack安装与配置 一.引言   本章内容讲解如何在3台物理机上搭建最小化云平台,这3台机器分为称为Server1.Server2和Client1,之后的各章也是如此.Server ...

  4. Jndi使用好处,与简单实例【Tomcat】

    JNDI学习总结(一)——JNDI数据源的配置 一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Class.forName("数据库驱动 ...

  5. Libgdx: 将Texturepacker打包的PNG图片还原成一张一张的单个的

    你是否发现用Texturepacker在打包压缩资源文件之后. 把原稿文件弄丢了,可是又要添加新的小png的时候,却无从下手了,本文就是博主在遇到这个问题后百度了非常多方法,可惜仅仅有plist格式的 ...

  6. php 禁止 URL 直接访问 php文件

    通过判断访问来源来实现. $fromurl="http://www.111.com/index.php"; //只能从这个地址访问 if( $_SERVER['HTTP_REFER ...

  7. 意外地解决了一个WPF布局问题

    原文:意外地解决了一个WPF布局问题 今天做了一个小测试,意外地将之前的一个困扰解决了,原问题见<WPF疑难杂症会诊>中的“怎么才能禁止内容撑大容器?” 以前我是在外侧嵌套Canvas容器 ...

  8. c#和UDP SOCKET广播

    server:  Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); // ...

  9. php laravel 帧 该文件上传

    好,我承认我的忠告. 今天laravel框架编写一个文件上传部分.总能找到不正确的路径.但是,终于攻克. 以下我分享一下自己的学习体会吧. client <form method="P ...

  10. 通过openssh远程登录时的延迟问题解决

    Linux下的ssh 服务器一般用的都是open-ssh,可是发现有些时候通过ssh连接服务器时总会有大概10秒钟左右的延迟. 一开始以为是openssh的安全策略,防止端口扫描,后来发现自己想多了. ...