最近互联网招聘平台拉勾网在五一期间推出个“最难面试的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
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);
}
}
}

输出如下:


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游戏的更多相关文章

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

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

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

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

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

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

  4. ThoughtWorks代码挑战——FizzBuzzWhizz

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

  5. 程序员面试京东前端,现场JavaScript代码写出魔方特效

    程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...

  6. 2019前端面试系列——JS高频手写代码题

    实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...

  7. 公司和家里代码文件同步方案: (git和dropbox实现)

    公司和家里代码文件同步方案: (git和dropbox实现) 参与公司福利购入了有补贴的macbook pro后, 就不用上下班背着电脑了. 但是也出现了另外一问题: 家里和公司代码同步的问题 公司有 ...

  8. IT软件外包行业深入分析:现状、前途、趋势、待遇 什么是软件外包 外包公司是怎么工作的 软件外包公司的面试 软件外包公司需要什么样的人

    目录: [0] - 为什么要对大学生谈软件外包? [1] - 什么是软件外包? [2] - 软件为什么要外包? [3] - 为什么要承接软件外包 [4] - 做软件外包有前途吗? [5] - 外包公司 ...

  9. 19年7月份面试7家公司,整理的java面试题(答案自行百度解决,也是个学习的过程)

    Dubbo与注册中心Zookeeper了解多少ConcurrentHashMap的原理 集合 HashMap 和 HashTable和ConcurrentHashMap的原理以及区别HashMap初始 ...

随机推荐

  1. 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  2. shell--3.运算符

    1.注意 原生bash不支持简单的数学运算,但是可以用其它命令来实现如 awk 和expr ,expr最常用 val=`expr 2 + 3` echo "结果 ${val}" # ...

  3. java基础知识(三)java关键字

    关键字是电脑语言事先定义的,是特别意义的标识符,又叫保留字.用来表示一种数据类型或程序的结构等,关键字不能用作变量名.类名.方法名或参数.java目前共有50个关键字,其中"const&qu ...

  4. django orm字段和参数

    字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=Tr ...

  5. python运算符

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAHCCAIAAADzel4SAAAgAElEQVR4Aey9+bMcSXLnV1dmna/ejR

  6. java程序打包成jar

    1. 建立文件夹:proj,在该文件夹下建立3个子文件夹:lib,src 2. 在lib文件夹中放置依赖的jar包 3. 在src中放置类文件:com.cnjava.demo.Main.java 4. ...

  7. php面试题2

    php面试题及答案(原创)收藏 基础题: 1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2 ...

  8. Hbase+ Phoenix搭建教程

    Hbase+ Phoenix搭建教程 一.Hbase简介 HBase是基于列存储.构建在HDFS上的分布式存储系统,其主要功能是存储海量结构化数据. HBase构建在HDFS之上,因此HBase也是通 ...

  9. js获取当前对象的颜色判断改变颜色

    function toHex(N) { if (N==null) return "00"; N=parseInt(N); if (N==0 || isNaN(N)) return ...

  10. 你不知道的parseInt

      首先,请允许我抄袭一段你知道的parseInt   以下节选自parseInt - JavaScript | MDN 实际上你连这些基础都没掌握 概述 parseInt() 函数将给定的字符串以指 ...