js 也来 - 【拉勾专场】抛弃简历!让代码说话!
2014-05-07 18:23
232 查看
前些日子谢亮兄弟丢了一个链接在群里,我当时看了下,觉得这种装逼题目没什么意思,因为每种语言都有不同的实现方法,
你怎么能说你的方法一定比其他语言的好,所以要好的思路 + 好的语言特性运用才能让代码升华。
题目如下:《【拉勾专场】抛弃简历!让代码说话!》
猛地一看,还以为是ACM....里的水题,额,好吧,其实这个考点在思路,而不是结果。
因为谁都能得到这个结果,但是思路就各出奇招吧。
一开始我也没什么好方法,所以没去做,今天想到个比较奇葩的方法实现的,给大家参考下。
可能其他语言根本不能这么用,因为js语言特性,所以他在js下能得到比好的结果。算是 js only 的代码吧。
简单说下思路吧。
1. 先处理 1 - 100 之间 3,5,7 的倍数的值,给他们累加字符串。
2. 遍历 1 - 100,如果编号含 3 的,就直接用 Fizz 覆盖,如果是空的返回编号,否则返回之前累加的字符串。
思路简单,直接上代码吧:
不到 20 行代码,我也不知道这个 "行" 是怎么定义的,在js里,全部缩成一行也是OK的,对吧。
如果按 ; 分,那整理下:
嗯,不错,5行代码,呵呵。。。
好了,不扯蛋了,只是分享下思路,不要研究10行还是5行实现的问题了,因为语言特性所致,没办法明确规定,思路新颖奇葩才能出彩。
刚才在开源中国看到一位大神8行实现,FizzBuzzWhizz,比我思路好多了,我简单修改了下,去掉了所有 if 语句,代码展开状态10行:
只有想不到,没有做不到,我会继续收集js版FizzBuzzWhizz神思路的。
你怎么能说你的方法一定比其他语言的好,所以要好的思路 + 好的语言特性运用才能让代码升华。
题目如下:《【拉勾专场】抛弃简历!让代码说话!》
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
猛地一看,还以为是ACM....里的水题,额,好吧,其实这个考点在思路,而不是结果。
因为谁都能得到这个结果,但是思路就各出奇招吧。
一开始我也没什么好方法,所以没去做,今天想到个比较奇葩的方法实现的,给大家参考下。
可能其他语言根本不能这么用,因为js语言特性,所以他在js下能得到比好的结果。算是 js only 的代码吧。
简单说下思路吧。
1. 先处理 1 - 100 之间 3,5,7 的倍数的值,给他们累加字符串。
2. 遍历 1 - 100,如果编号含 3 的,就直接用 Fizz 覆盖,如果是空的返回编号,否则返回之前累加的字符串。
思路简单,直接上代码吧:
var key = [3, 5, 7], // 特殊数字 keyStr = ["Fizz", "Buzz", "Whizz"], // 替换字符 arr = Array(101).join(",").split(","), // 初始化101个空字符串数组 i = 0, // 累加器 n = 1, // 倍数累加器 tmp; // 临时变量 for (; i<3; i++, n=1) { // 遍历 key 数组 while (101 > (tmp = key[i]*n++)) { // n倍结果 arr[tmp] += keyStr[i]; // 累加字符串 } } for (i=1; i<101; i++) { arr[i] = (i+"").indexOf(key[0])>-1 ? keyStr[0] : arr[i] === '' ? i : arr[i]; } arr.shift(); // 去除下标0的元素 console.log(arr.join("\n"));
不到 20 行代码,我也不知道这个 "行" 是怎么定义的,在js里,全部缩成一行也是OK的,对吧。
如果按 ; 分,那整理下:
var key = [3, 5, 7], keyStr = ["Fizz", "Buzz", "Whizz"], arr = Array(101).join(",").split(","), i = 0, n = 1, tmp; for (; i<3; i++, n=1) while (101 > (tmp = key[i]*n++)) arr[tmp] += keyStr[i]; for (i=1; i<101; i++) arr[i] = (i+"").indexOf(key[0])>-1 ? keyStr[0] : arr[i] === '' ? i : arr[i]; arr.shift(); console.log(arr.join("\n"));
嗯,不错,5行代码,呵呵。。。
好了,不扯蛋了,只是分享下思路,不要研究10行还是5行实现的问题了,因为语言特性所致,没办法明确规定,思路新颖奇葩才能出彩。
刚才在开源中国看到一位大神8行实现,FizzBuzzWhizz,比我思路好多了,我简单修改了下,去掉了所有 if 语句,代码展开状态10行:
function cd(x, y, s) { return x % y === 0 ? s : ''; } function bs(a, b, c) { for (var i = 1; i <= 100; i++) { var d = cd(i, a, 'Fizz') + cd(i, b, 'Buzz') + cd(i, c, "Whizz"); console.log((i + "").indexOf(a) !== -1 ? "Fizz" : d !== '' ? d : i); } } bs(3, 5, 7);
只有想不到,没有做不到,我会继续收集js版FizzBuzzWhizz神思路的。
相关文章推荐
- 参与《【拉勾专场】抛弃简历!让代码说话!》编程挑战的尝试
- JS代码的格式化和压缩
- 比较全的JS checkbox全选、取消全选、删除功能代码
- JS组件Bootstrap Table表格多行拖拽效果实现代码
- 百度网页分享js代码
- js字符串日期yyyy-MM-dd转化为date示例代码
- eclipse中提示js或者JQuery代码
- 200多个常用js代码
- 三种动态加载js的jquery实例代码另附去除js方法
- js Flash插入函数免激活代码
- JS (Javascript)取当前日期、时间的代码
- 用 webpack 构建 node 后端代码,使其支持 js 新特性并实现热重载
- MicrosoftAjax.Function.js 中用call 和apply方法实现回调和委托的代码
- 将本页添加到收藏夹的js代码
- js实现兼容IE、Firefox的图片缩放代码
- js 常用代码2
- js实现iframe动态调整高度的代码
- [JS代码]如何判断ipad或者iphone是否为横屏或者竖屏 - portrait或者landscape
- 一段最短的代码,用上js所有关键字