滴滴出行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);
View Code

这点数据量也是可以看出来还是有那么一些差距的

一个苦逼程序员
原文地址:https://www.cnblogs.com/root_u/p/5168948.html