今天看到一个很有意思的面试活动(活动链接),不需要简历,只有一道编程题目,在线提交你的代码即可。

本菜鸟对面试不感兴趣,但题目让我很兴奋,特来挑战一下~

或许当你看到这篇博文的时候活动已经失效了,所以小菜就把题目记下来:

大道至简,知易行难!

我们的题目简约而不简单,千万不要轻敌,即使简单的代码,做到尽善尽美一样难能可贵,所以,提交之前,请想一想,它是不是可以更卓越,有人可以10行搞定,亲,你呢 :)

代码要求:

1,语言不限,Java, C#, Ruby, C++, Js, Python, Scala, objective-C统统可以,小语种也没问题,只要你擅长;

2,强烈建议写单元测试;

3,请展示出你超赞的面向对象/函数式编程功底;

4,建议尽量减少圈复杂度;

5,请提交可运行的代码,及相关构建脚本/说明文档(代码运行平台和环境);

FizzBuzzWhizz

你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有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

题目本身并不难,但考察了很多细节。

比如,"建议写单元测试"、"面向对象/函数式编程功底",应该是考察的重点;"有人可以10行搞定",这纯属骗人,不是说不可以用10行代码搞定,靠一些非常规技巧,是可以实现,但这显然不是可维护的代码,也展现不出你的功力,当真你就上当了。

小菜选用的语言是JavaScript,因为她比较简单,也不需要什么环境,浏览器就可以了~

小菜写的仅仅是一个简单实现,给大家分享思路,不足之处多多包涵。

fbw.js

 //定义游戏封装"类"
//max 整数上限,params 规定的数据结构
var fbw = function(max,params){
this.params = params;
//逻辑集合(以下划线开头的变量表示私有,外部不应调用)
this._logics = [];
//定义核心执行接口
this._exec = function(){
var list = [];
//遍历整数
for(var i=1;i<=max;i++){
var buffer = "";
//遍历特殊数
for(var j=0;j<params.length;j++){
var _j = params[j];
//遍历规则
for(var k=0;k<_j.rules.length;k++){
var _k = _j.rules[k];
var result = this._logics[_k](i,_j);
if(result != null){
buffer += result;
break;
}
}
}
//填入列表
if(buffer){
list.push(buffer);
}else{
list.push(i);
}
} return list;
};
} //定义输出接口
fbw.prototype.getFBW = function(){
//1.重新组织逻辑集合
this._logics = [];
//规则中参数统一:n目标数,o特殊数对象
//规则4(实际上第三条和第四条可以统一到规则4)
this._logics[4] = function(n,o){
if(n % o.number == 0){
return o.name;
}else{
return null;
}
}
//规则5
this._logics[5] = function(n,o){
if(n.toString().indexOf(o.number.toString())>=0){
return o.name;
}else{
return null;
}
} //2.调用核心执行接口
return this._exec();
};

fbw.html

 <!DOCTYPE html>
<html>
<head>
<title>FizzBuzzWhizz - By YangYuan</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<!-- 结果列表 -->
<textarea id="fbwText" rows="30" cols="20"></textarea> <script src="js/fbw.js"></script>
<script>
//实例化
var f = new fbw(100,
[{
//特殊数
number: 3,
//特殊数代表的名称
name: "Fizz",
//规则列表,如果前边的规则一旦匹配,将忽略后边的规则
rules: [5,4]
},{
number: 5,
name: "Buzz",
rules: [4]
},{
number: 7,
name: "Whizz",
rules: [4]
}]
); //获取结果
var list = f.getFBW(); //显示到页面
for(var i in list){
document.getElementById("fbwText").value =
document.getElementById("fbwText").value +
"\n" +
list[i];
}
</script>
</body>
</html>

运行效果:

博客里看的不爽,可以直接打包下载:下载地址

拉勾网ThoughtWorks面试题代码实现的更多相关文章

  1. 一行代码搞定ThoughtWorks面试题

    今天在微博看到一道有趣的题目.作为python的脑残粉,自然手痒. 题目在这里. FizzBuzzWhizz 你是一名体育老师.在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课 ...

  2. thoughtworks面试题分析与解答

    题目描述 A squad of robotic rovers are to be landed by NASA on a plateau on Mars. This plateau, which is ...

  3. Java 面试题代码类收集

    long temp=(int)3.9; System.out.println(temp); temp%=2; System.out.println(temp); 3 1 Java里面类的方法名可以与类 ...

  4. 2019 DevOps 必备面试题——代码版本控制篇

    原文地址:https://medium.com/edureka/devops-interview-questions-e91a4e6ecbf3 原文作者:Saurabh Kulshrestha 翻译君 ...

  5. Java面试题代码篇

    1.统计字符串中的各种字符的个数并对其排序 package JavaMianSiTest; public class TongJIZiFu { public static void main(Stri ...

  6. ThoughtWorks Merchant's Guide To The Galaxy

    ThoughtWorks笔试题之Merchant's Guide To The Galaxy解析 一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天H ...

  7. 设计模式之模板方法模式&&迪米特法则(代码Objective-C展示)

    模板方法模式 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变一个算法的结构即可重定义该算法的某些特定步骤. 比如说,小时候数学老师的随堂检测,都是在黑板 ...

  8. .NET面试题(三)

    第1讲:面试前期准备 1.了解相关技术职务需要的技术人才                              2.准备一份出色的个人简历 第2讲:面试前期准备                   ...

  9. 常见面试题整理--Python概念篇

    希望此文可以长期更新并作为一篇Python的面试宝典.每一道题目都附有详细解答,以及更加详细的回答链接.此篇是概念篇,下一篇会更新面试题代码篇. (一).这两个参数是什么意思:*args,**kwar ...

随机推荐

  1. ORACLE 10进制与16进制的互相转换

    1. 10---->16 使用to_char(10,'xxx')函数,如果位数长,多加几个 x 2. 16---->10 使用to_number(’a','xxx')函数,如果位数长,多加 ...

  2. Java制作证书的工具keytool用法总结

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  3. css3浏览器前缀 -mos/-webkit/-o/-ms

    1.css3浏览器前缀的意思 -moz为firefox的前缀: -webkit为safari和chrome的前缀: -o为opera浏览器的前缀: -ms为ie浏览器的前缀: 2.常见的需要使用浏览器 ...

  4. fail2ban 原理 安装 使用

    cd fail2ban python setup.py install /etc/fail2ban/ 为配置文件目录; /usr/lib/pythonx.x/site-packages/fail2ba ...

  5. PHP 输出缓冲控制(Output Control) 学习

    php 缓冲简介 其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者 ...

  6. Bing Map

    To use map services in Windows 10 packages for this application, you need to acquire a token from th ...

  7. Dojo注意

    关于插件的加载: 回调函数中的顺序,是按照插件的顺序填写的,否则就很可能会插件加载出错.

  8. mysql.sock

    Mysql有两种连接方式: (1)TCP/IP (2)socket 对mysql.sock来说,其作用是程序与mysqlserver处于同一台机器,发起本地连接时可用. 例如你无须定义连接host的具 ...

  9. java中两个值互换

    两个值互换有以下三种方式: 使用临时变量(此种方法便于理解) x = 10; y = 20; //begin int temp = x; x = y; y = temp; //end; //此时x = ...

  10. 斯坦福第七课:正则化(Regularization)

    7.1  过拟合的问题 7.2  代价函数 7.3  正则化线性回归 7.4  正则化的逻辑回归模型 7.1  过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集( ...