滴滴出行2016研发工程师笔试题(亮灯问题)
2015盏灯,一开始全部熄灭,序号分别是1-2015,先把1的倍数序号的灯的开关全部按一次,然后把2的倍数的灯的开关全部按一次,然后把3的倍数的开关按一次,以此类推,最后把2015的倍数灯的开关按一次。问最后亮着的灯有多少盏?
- 43
- 44
- 45
- 46
问题分析:
初始:全是灭的
1:全部亮
2:1,3,5 ,7,9,11,13。。。
3:1亮,6亮,12亮。
4:1,4,6,8。。。亮
----------------------------------
可以发现1是一直亮着的后面的倍数都是比1大,所以1点击一次后不再点击。
2和3号由于是两次点击不再亮。。
4号由于是3次点击亮
只有奇数次
可以断定最终奇数次点击的灯是亮着的,偶数次点击是关闭的。
题目转换:
1-2015 每个数能被多少个正整数整除,求可以被奇数个正整数整除的总数。
即哪些数有奇数个因子数。
继续看规律。
1:1 奇数个因子数
2:1,2
3:1,3
4:1,2,4 奇数个因子数
5:1,5
6:1,2,3,6
7:1,7
8:1,2,4,8
9:1,3,9 亮 奇数个因子数
。。。。。。
可以发现1,4,9,16,25。。才是亮的
即:1^2,2^2,3^2,4^2,5^2....
最终转换问题,求最大的一个数的平方不大于2015。
43*43=129+(172)*10 满足
44*44 = 176 +1760 满足
45*45 = 225+(1800) 超过
----------------
对于原始问题的编程
1 TimeSpan ts = new TimeSpan(); 2 int count = 0; 3 DateTime dt = DateTime.Now; 4 for (int i = 1; i <= 2015; i++) 5 { 6 int index = 1; 7 int click = 0; 8 9 while (index <= i) { 10 if (i % index == 0) 11 click += 1; 12 index += 1; 13 } 14 if (click % 2 != 0) { 15 count += 1; 16 Console.Write(i+" "); 17 } 18 } 19 DateTime dt1 = DateTime.Now; 20 ts = dt1 - dt; 21 Console.Write("普通 Count:" + count +"耗时:"+ts); 22 Console.WriteLine(""); 23 count = 0 ; 24 DateTime dt2 = DateTime.Now; 25 for (int i = 1; i <= 2015; i++) 26 { 27 if (i * i <= 2015) 28 { 29 count += 1; 30 Console.Write(i + " "); 31 } 32 else 33 { 34 break; 35 } 36 } 37 DateTime dt3 = DateTime.Now; 38 ts = dt3 - dt2; 39 Console.Write("优化 Count:" + count + "耗时:" + ts);
这点数据量也是可以看出来还是有那么一些差距的
一个苦逼程序员