最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏
最近互联网招聘平台拉勾网在五一期间推出个“最难面试的IT公司”代码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks、Google、Unisys、Rackspace、Cypress Semiconductor。每个公司联合拉勾网推出代码挑战,针对每个挑战都可以提交我们自己的代码,如果通过代码测试,就会在后面几天收到相关公司的笔试、面试邀请,这些都不多说了,感兴趣的现在参加还来得及。这些题目简约而不简单,也就是看上去十分的简单,但是做到尽善尽美难能可贵,这就是为什么面试难的原因,给你的题目非常简单,你自以为写的非常正确但最终还是被刷,似乎莫名其妙,其实你的代码漏洞百出。
比如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
FizzFizz
Whizz
FizzBuzz
16
17
Fizz
19
Buzz
…一直到100
- 三个数都是个位数,这里也没说是否包含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);
}
}
}
输出如下:
Fizz Buzz
Fizz
Whizz Fizz
Buzz Fizz
Fizz
Whizz
FizzBuzz Fizz Buzz
FizzWhizz Fizz
Fizz
Buzz Fizz
Whizz Fizz
Fizz
Fizz
Fizz
Fizz
Fizz
Fizz
Fizz
Fizz
Fizz
Buzz FizzWhizz
Fizz FizzBuzz Fizz
Whizz
Buzz
Fizz Fizz
Fizz
Buzz
Whizz
Fizz FizzBuzz Fizz Buzz
Fizz Fizz
BuzzWhizz Fizz
Fizz FizzBuzz Whizz
Fizz Buzz
Fizz Fizz
FizzWhizz
Buzz Fizz FizzBuzz
Whizz Fizz Buzz
Fizz Whizz
Fizz
Buzz
当然不是一个.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游戏的更多相关文章
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)
原题 看到那么多人看到前面这么糟粕的代码各种不忍直视后,楼主还是把最终实现放在页首吧. Console.WriteLine("说出三个不同的特殊数,用','隔开 &q ...
- ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#)
最早看到这个题目是从@ 程序媛想事儿(Alexia) 的 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏 开始的,然后这几天陆陆续续有N个小伙伴发表了自己的文章 ...
- 最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏
最近的互联网招聘平台拉勾网在五月推出了"最艰难的采访IT公司"码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspac ...
- ThoughtWorks代码挑战——FizzBuzzWhizz
很久没发表过文章了,今天看到一篇文章 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法) 看到LZ的2B青年代码,实在是惨不忍睹,故写篇文章来探讨下这类 ...
- 程序员面试京东前端,现场JavaScript代码写出魔方特效
程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...
- 2019前端面试系列——JS高频手写代码题
实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...
- 公司和家里代码文件同步方案: (git和dropbox实现)
公司和家里代码文件同步方案: (git和dropbox实现) 参与公司福利购入了有补贴的macbook pro后, 就不用上下班背着电脑了. 但是也出现了另外一问题: 家里和公司代码同步的问题 公司有 ...
- IT软件外包行业深入分析:现状、前途、趋势、待遇 什么是软件外包 外包公司是怎么工作的 软件外包公司的面试 软件外包公司需要什么样的人
目录: [0] - 为什么要对大学生谈软件外包? [1] - 什么是软件外包? [2] - 软件为什么要外包? [3] - 为什么要承接软件外包 [4] - 做软件外包有前途吗? [5] - 外包公司 ...
- 19年7月份面试7家公司,整理的java面试题(答案自行百度解决,也是个学习的过程)
Dubbo与注册中心Zookeeper了解多少ConcurrentHashMap的原理 集合 HashMap 和 HashTable和ConcurrentHashMap的原理以及区别HashMap初始 ...
随机推荐
- 父类方法返回子类实例:PHP延迟静态绑定
案例分析 先前的PHP项目中,看到类似于以下的一段代码: <?php class DBHandler { public function get() { } } class MySQLHandl ...
- iterator接口
Iterator用来做遍历,所有实现Collection接口的容器都有一个Iterator的方法以返回一个Iterator接口的对象
- mediastreamer使用教程
mediastreamer使用教程 1.各个函数功能简介 ms_filter_destroy 释放filter资源 ms_ticker_destroy释放ticker 说明:ticker为定时器线程, ...
- PHP 变量声明的意义
有人说,PHP是没有类型的语言,个人比较倾向于,PHP是弱类型的计算机脚本语言的说法. 计算机存储都是二进制的数据,要么是0,要么是1. 在抽象数据的过程中,是要有各种各样的标志位来识别数据. 虽然, ...
- EL表达式获取数据的方式
<%@page import="cn.jiemoxiaodi.domain.Person"%> <%@ page language="java" ...
- mysql锁SELECT FOR UPDATE【转】
MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE ...
- .NET 事件
事件概述 在发生其他类或对象关注的事情时,类或对象可通过事件通知它们.发 ...
- .NET LINQ 相等运算
相等运算 如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则视这两个序列相等. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 Seq ...
- js屏幕尺寸 笔记
"屏幕分辨率为:"+screen.width+"*"+screen.height "屏幕可用大小:"+screen.availWidth+& ...
- python--基础学习(五)参数位置传递、关键字传递、包裹传递及解包裹
python系列均基于python3.4环境 1.位置传递和关键字传递 代码示例 #位置传递 def fun(a,b,c): print("a: {0}, b: {1}, c: {2}&qu ...