前端在线编程笔试记录——幸运数字
2016-09-06 13:06
477 查看
来自某公司在线笔试题
题目大意:
假设有两个幸运数字,4和7(其实没觉得这俩在一起是幸运的。。。),我换成3和7吧,然后他们组成数字,规律如下:3,7,33,37,73,77,333,337,373,377,733,737,773,777....
请给出函数:输出第k个该是什么数字。如:main(3) 得到33,main(7)得到333,等等。
考试的时候只有点点眉目,仍然做不成,完了后才继续做出来。也不知道自己做复杂了没有,先贴出来吧!
我的思路:
先贴张思路图:其实数字3,7可看作简单一点的0和1,到时候再替换一下,把0换成3,1换成7,就行了
于是就变成了0,1,00,01,10,11,000,001,010,011,......
咋一看就是一堆二进制数了,看起来舒服多了。继续换成对应的十进制:0,1, 0,1,2,3, 0,1,2,3,4,5,6,7,......
找一下规律,这就是按照2的阶乘递增分组的,第一组看作2的1次方, 2的2次方, 2的3次方.....一直到2的n次方。
如何对应:比如说现在我们要找第9个数是什么,通过9去找到对应的十进制是2,然后转为二进制10,然后补一个前导0,得到"010",然后替换"373",就成功了。
简化之为,9 => 2 => 10 => 010 => 373.
也许需要费点事的是如何让9对应于2?前面说了分组后其实是2的阶乘组成的等比数列。可能对着下面代码看更清楚些。
功能实现:
function main(k){ //将上面看作0,1,00,01,10,11,000,001....换做二进制来看 var n=1, num=0, binaryStr, <span style="white-space:pre"> </span>tempZeros=[]; while(true){ //等比数列前n项和与传参k之差为num,如果num>=0,则说明k这个数在2的n次方这一组里面,否则继续看下一个n项和 //这个n就说明了换算的二进制应该占多少位,比如3位的话10就该换为010。 num = Math.pow(2,n+1)-2-k; if(num>=0){ break; } n++; } num = Math.pow(2,n)-num-1; //稍稍推算,此时k对应的十进制数应该为这里的num binaryStr = num.toString(2); //换成二进制字符串形式:如2换成"10" for(var i=0,len=binaryStr.length;i<n-len;i++){ //补足前导0 binaryStr='0'+binaryStr; } var result = binaryStr.replace(/\d/g,function(m){ //将0和1替换为3和7 switch(m){ case '0': return '3'; break; case '1': return '7'; break; default: break; } }) console.log(result); }
==========================================================
许祥记于2016校园秋招。
相关文章推荐
- 前端在线编程笔试记录——蛇形数字
- 2015 阿里校招 Web前端开发 在线笔试总结
- 阿里巴巴2015秋季校园招聘前端开发工程师在线笔试题及答案
- 记录几个在线学习编程的网址
- Java在线笔试编程(3)---计算回文序列
- Java在线笔试编程(2)---模拟内存操作
- 2014阿里巴巴WEB前端实习生在线笔试题
- 2017微软秋季校园招聘在线编程笔试 Composition
- 2015阿里巴巴前端实习生在线笔试题
- 2015某大型电商集团的前端实习生在线笔试题(无耻的拿来偷看了)
- 去哪儿网2017校招在线笔试(前端工程师)编程题及JavaScript代码
- 2015阿里巴巴秋季校园招聘前端 在线笔试题个人参考答案
- 阿里巴巴2015校园招聘前端在线笔试题
- 阿里巴巴2015秋季校园招聘前端开发工程师在线笔试题及答案
- 2015年9月百度前端在线笔试
- 2015阿里巴巴前端实习生在线笔试题
- 2014阿里巴巴WEB前端实习生在线笔试题
- 2014阿里巴巴WEB前端实习生在线笔试题
- 阿里巴巴2014实习生前端招聘在线笔试题
- 【在线笔试题解题报告系列】网易2017校招内推笔试之编程题【持续更新】