面试题:4亿里有多少个1(11算2个)

开发 前端
对于我们进入职场,当然要经过面试。下面就是面试中的一道题,让我们起来看。

面试题:4亿里有多少个1(11算2个)

乍看这题真够唬人的,群里看到这个题目后争先恐后的说看法。最简单的办法不外乎就是遍历每个数,然后toString() 看看里面有多少个1,最后全部加起来,这是我们得到标准答案的办法。

群里算上我3个人写了3个笨方法都跑出来了,3个笨方法,呵呵 有意思,笨方法也不一样。 程序的实现真是变幻莫测。

  1. var re = /1{1}/g;   
  2. var max = 4 * 10000 * 10000;   
  3. getTotal(f);   
  4. getTotal(f1);   
  5. getTotal(f2);   
  6. function getTotal(func)   
  7. {   
  8. var total = 0;   
  9. var begin = new Date();   
  10. for(var i= 1 ;i <= max;i++)   
  11. {   
  12. total += func(i);   
  13. }   
  14. var end = new Date();   
  15. var timespan = end - begin;   
  16. alert("开始时间:"+begin + "\n 结束时间:"+end +"\n总耗时:"+timespan + "毫秒 \n 总数:"+total);   
  17. }   
  18. function f(num)   
  19. {   
  20. var t = 0;   
  21. while(num)   
  22. {   
  23. if(num < 10){ if(num==1)t++;break;}   
  24. var i = num % 10;   
  25. if(i == 1) t++;   
  26. num = parseInt(num / 10);   
  27. }   
  28. return t;   
  29. }   
  30. function f1(num)   
  31. {   
  32. var str = num.toString()   
  33. var t = 0;   
  34. for(var i=0;i<str.length;i++)   
  35. {   
  36. if(str.charAt(i)=="1") t++;   
  37. }   
  38. return t;   
  39. }   
  40. function f2(num)   
  41. {   
  42. var str = num.toString();   
  43. var t = 0;   
  44. while(re.exec(str))   
  45. {   
  46. t++;   
  47. }   
  48. return t;   
  49. }  

当数量少的时候第一种最快,显然嘛,没有处理字符串的步骤。按理说数量越大他越有优势。 可是实测结果,3个都差不多。但是用C#跑的话,第一个明显越来越有优势。。。。

但是出题人肯定不是这样想的,很多人都在说自己的技巧与看法,我也思考了很久。

先拿 100来说 ,100里面有多少个1?

 

  1. 10  
  2. 11  
  3. 12  
  4. 13  
  5. 14  
  6. 15   
  7. 16   
  8. 17   
  9. 18   
  10. 19   
  11. 01   
  12. 11   
  13. 21   
  14. 31   
  15. 41   
  16. 51   
  17. 61   
  18. 71   
  19. 81   
  20. 91 

 

故意这么排列是我们可以把 0~99看作是 1个长度为2的数组, 1位为1时,2位的可能性是10,2位为1时1位的可能性为10,所以 0~99应该有20个1,而100有1个所以是21个。

999就应该是 1*10*10 + 10*1*10 + 10*10*1 = 300

400呢? 因为首位只能出现0~3 ,所以应该是 1*10*10 + 4*1*10 + 4*1*10

4 0000 0000 应该是 1 * (10^8) + 4*(10^7) * 8 = 420000000

通过本文的分析,你是不是了解了呢??程序真的是太变化莫测了,同样,一道题当然有不同的解法。如果你有,我们可以一同分享。

【编辑推荐】

  1. 三大鼎足IT名企面试题
  2. 1.4.3 有趣的微软面试题目
  3. 深入剖析C/C++程序员应聘常见面试题
  4. 应届毕业生应聘求职:25个刁钻面试题解析
责任编辑:于铁 来源: 博客园
相关推荐

2014-09-02 11:04:49

PHP面试题PHP

2019-09-30 08:50:51

Linux发行版内核

2024-06-04 14:52:28

2014-12-02 10:02:30

2015-08-27 09:27:34

JavaScript面试题

2017-08-29 14:12:16

Java面试题

2019-03-23 20:00:04

面试react.js前端

2016-05-05 17:45:43

Spring面试题答案

2011-07-18 15:08:19

SQL存储过程

2021-06-02 12:12:46

DevOps面试Linux

2021-10-27 06:32:06

服务器JVM内存

2023-09-26 16:44:14

光模块

2012-08-02 09:36:58

fork面试题

2019-11-26 10:30:11

CSS前端面试题

2019-08-09 09:50:38

Java编程语言面试题

2015-08-19 09:35:49

Java main面试题

2015-09-29 09:24:22

Node.js面试题

2019-01-02 16:31:33

程序员技术互联网

2020-06-04 14:40:40

面试题Vue前端

2020-08-04 16:56:50

Java方法参数
点赞
收藏

51CTO技术栈公众号