初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
示例:
输入: 3 输出: 1 解释: 初始时, 灯泡状态 [关闭, 关闭, 关闭]. 第一轮后, 灯泡状态 [开启, 开启, 开启]. 第二轮后, 灯泡状态 [开启, 关闭, 开启]. 第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 你应该返回 1,因为只有一个灯泡还亮着。
思路:首先想到的就是数组来模拟每个灯泡的状态,0代表关闭,1代表开启。.模拟n轮后遍历数组寻找开启的灯泡个数。
class Solution {
public int bulbSwitch(int n) {
int[] a=new int[n];
for(int i=1;i<=n;i++){
trunOf(a,i);
}
int count=0;
for(int i=0;i<a.length;i++){
if(a[i]!=0){
count++;
}
}
return count;
}
public void trunOf(int a[],int k){
for(int i=k-1;i<a.length;i+=k){
if(a[i]==0){
a[i]=1;
}else{
a[i]=0;
}
}
}
}
但是提交代码会超出时间限制。于是猜想这其中是不是有什么规律,将1到200内的灯泡数全部进行n轮开关后,开启的灯泡个数打印出来,结果如下
灯泡数:1 n轮后开启的灯泡数: 1
灯泡数:2 n轮后开启的灯泡数: 1
灯泡数:3 n轮后开启的灯泡数: 1
灯泡数:4 n轮后开启的灯泡数: 2
灯泡数:5 n轮后开启的灯泡数: 2
灯泡数:6 n轮后开启的灯泡数: 2
灯泡数:7 n轮后开启的灯泡数: 2
灯泡数:8 n轮后开启的灯泡数: 2
灯泡数:9 n轮后开启的灯泡数: 3
灯泡数:10 n轮后开启的灯泡数: 3
灯泡数:11 n轮后开启的灯泡数: 3
灯泡数:12 n轮后开启的灯泡数: 3
灯泡数:13 n轮后开启的灯泡数: 3
灯泡数:14 n轮后开启的灯泡数: 3
灯泡数:15 n轮后开启的灯泡数: 3
灯泡数:16 n轮后开启的灯泡数: 4
灯泡数:17 n轮后开启的灯泡数: 4
灯泡数:18 n轮后开启的灯泡数: 4
灯泡数:19 n轮后开启的灯泡数: 4
灯泡数:20 n轮后开启的灯泡数: 4
灯泡数:21 n轮后开启的灯泡数: 4
灯泡数:22 n轮后开启的灯泡数: 4
灯泡数:23 n轮后开启的灯泡数: 4
灯泡数:24 n轮后开启的灯泡数: 4
灯泡数:25 n轮后开启的灯泡数: 5
灯泡数:26 n轮后开启的灯泡数: 5
灯泡数:27 n轮后开启的灯泡数: 5
灯泡数:28 n轮后开启的灯泡数: 5
灯泡数:29 n轮后开启的灯泡数: 5
灯泡数:30 n轮后开启的灯泡数: 5
灯泡数:31 n轮后开启的灯泡数: 5
灯泡数:32 n轮后开启的灯泡数: 5
灯泡数:33 n轮后开启的灯泡数: 5
灯泡数:34 n轮后开启的灯泡数: 5
灯泡数:35 n轮后开启的灯泡数: 5
灯泡数:36 n轮后开启的灯泡数: 6
灯泡数:37 n轮后开启的灯泡数: 6
灯泡数:38 n轮后开启的灯泡数: 6
灯泡数:39 n轮后开启的灯泡数: 6
灯泡数:40 n轮后开启的灯泡数: 6
灯泡数:41 n轮后开启的灯泡数: 6
灯泡数:42 n轮后开启的灯泡数: 6
灯泡数:43 n轮后开启的灯泡数: 6
灯泡数:44 n轮后开启的灯泡数: 6
灯泡数:45 n轮后开启的灯泡数: 6
灯泡数:46 n轮后开启的灯泡数: 6
灯泡数:47 n轮后开启的灯泡数: 6
灯泡数:48 n轮后开启的灯泡数: 6
灯泡数:49 n轮后开启的灯泡数: 7
灯泡数:50 n轮后开启的灯泡数: 7
灯泡数:51 n轮后开启的灯泡数: 7
灯泡数:52 n轮后开启的灯泡数: 7
灯泡数:53 n轮后开启的灯泡数: 7
灯泡数:54 n轮后开启的灯泡数: 7
灯泡数:55 n轮后开启的灯泡数: 7
灯泡数:56 n轮后开启的灯泡数: 7
灯泡数:57 n轮后开启的灯泡数: 7
灯泡数:58 n轮后开启的灯泡数: 7
灯泡数:59 n轮后开启的灯泡数: 7
灯泡数:60 n轮后开启的灯泡数: 7
灯泡数:61 n轮后开启的灯泡数: 7
灯泡数:62 n轮后开启的灯泡数: 7
灯泡数:63 n轮后开启的灯泡数: 7
灯泡数:64 n轮后开启的灯泡数: 8
灯泡数:65 n轮后开启的灯泡数: 8
灯泡数:66 n轮后开启的灯泡数: 8
灯泡数:67 n轮后开启的灯泡数: 8
灯泡数:68 n轮后开启的灯泡数: 8
灯泡数:69 n轮后开启的灯泡数: 8
灯泡数:70 n轮后开启的灯泡数: 8
灯泡数:71 n轮后开启的灯泡数: 8
灯泡数:72 n轮后开启的灯泡数: 8
灯泡数:73 n轮后开启的灯泡数: 8
灯泡数:74 n轮后开启的灯泡数: 8
灯泡数:75 n轮后开启的灯泡数: 8
灯泡数:76 n轮后开启的灯泡数: 8
灯泡数:77 n轮后开启的灯泡数: 8
灯泡数:78 n轮后开启的灯泡数: 8
灯泡数:79 n轮后开启的灯泡数: 8
灯泡数:80 n轮后开启的灯泡数: 8
灯泡数:81 n轮后开启的灯泡数: 9
灯泡数:82 n轮后开启的灯泡数: 9
灯泡数:83 n轮后开启的灯泡数: 9
灯泡数:84 n轮后开启的灯泡数: 9
灯泡数:85 n轮后开启的灯泡数: 9
灯泡数:86 n轮后开启的灯泡数: 9
灯泡数:87 n轮后开启的灯泡数: 9
灯泡数:88 n轮后开启的灯泡数: 9
灯泡数:89 n轮后开启的灯泡数: 9
灯泡数:90 n轮后开启的灯泡数: 9
灯泡数:91 n轮后开启的灯泡数: 9
灯泡数:92 n轮后开启的灯泡数: 9
灯泡数:93 n轮后开启的灯泡数: 9
灯泡数:94 n轮后开启的灯泡数: 9
灯泡数:95 n轮后开启的灯泡数: 9
灯泡数:96 n轮后开启的灯泡数: 9
灯泡数:97 n轮后开启的灯泡数: 9
灯泡数:98 n轮后开启的灯泡数: 9
灯泡数:99 n轮后开启的灯泡数: 9
灯泡数:100 n轮后开启的灯泡数: 10
灯泡数:101 n轮后开启的灯泡数: 10
灯泡数:102 n轮后开启的灯泡数: 10
灯泡数:103 n轮后开启的灯泡数: 10
灯泡数:104 n轮后开启的灯泡数: 10
灯泡数:105 n轮后开启的灯泡数: 10
灯泡数:106 n轮后开启的灯泡数: 10
灯泡数:107 n轮后开启的灯泡数: 10
灯泡数:108 n轮后开启的灯泡数: 10
灯泡数:109 n轮后开启的灯泡数: 10
灯泡数:110 n轮后开启的灯泡数: 10
灯泡数:111 n轮后开启的灯泡数: 10
灯泡数:112 n轮后开启的灯泡数: 10
灯泡数:113 n轮后开启的灯泡数: 10
灯泡数:114 n轮后开启的灯泡数: 10
灯泡数:115 n轮后开启的灯泡数: 10
灯泡数:116 n轮后开启的灯泡数: 10
灯泡数:117 n轮后开启的灯泡数: 10
灯泡数:118 n轮后开启的灯泡数: 10
灯泡数:119 n轮后开启的灯泡数: 10
灯泡数:120 n轮后开启的灯泡数: 10
灯泡数:121 n轮后开启的灯泡数: 11
灯泡数:122 n轮后开启的灯泡数: 11
灯泡数:123 n轮后开启的灯泡数: 11
灯泡数:124 n轮后开启的灯泡数: 11
灯泡数:125 n轮后开启的灯泡数: 11
灯泡数:126 n轮后开启的灯泡数: 11
灯泡数:127 n轮后开启的灯泡数: 11
灯泡数:128 n轮后开启的灯泡数: 11
灯泡数:129 n轮后开启的灯泡数: 11
灯泡数:130 n轮后开启的灯泡数: 11
灯泡数:131 n轮后开启的灯泡数: 11
灯泡数:132 n轮后开启的灯泡数: 11
灯泡数:133 n轮后开启的灯泡数: 11
灯泡数:134 n轮后开启的灯泡数: 11
灯泡数:135 n轮后开启的灯泡数: 11
灯泡数:136 n轮后开启的灯泡数: 11
灯泡数:137 n轮后开启的灯泡数: 11
灯泡数:138 n轮后开启的灯泡数: 11
灯泡数:139 n轮后开启的灯泡数: 11
灯泡数:140 n轮后开启的灯泡数: 11
灯泡数:141 n轮后开启的灯泡数: 11
灯泡数:142 n轮后开启的灯泡数: 11
灯泡数:143 n轮后开启的灯泡数: 11
灯泡数:144 n轮后开启的灯泡数: 12
灯泡数:145 n轮后开启的灯泡数: 12
灯泡数:146 n轮后开启的灯泡数: 12
灯泡数:147 n轮后开启的灯泡数: 12
灯泡数:148 n轮后开启的灯泡数: 12
灯泡数:149 n轮后开启的灯泡数: 12
灯泡数:150 n轮后开启的灯泡数: 12
灯泡数:151 n轮后开启的灯泡数: 12
灯泡数:152 n轮后开启的灯泡数: 12
灯泡数:153 n轮后开启的灯泡数: 12
灯泡数:154 n轮后开启的灯泡数: 12
灯泡数:155 n轮后开启的灯泡数: 12
灯泡数:156 n轮后开启的灯泡数: 12
灯泡数:157 n轮后开启的灯泡数: 12
灯泡数:158 n轮后开启的灯泡数: 12
灯泡数:159 n轮后开启的灯泡数: 12
灯泡数:160 n轮后开启的灯泡数: 12
灯泡数:161 n轮后开启的灯泡数: 12
灯泡数:162 n轮后开启的灯泡数: 12
灯泡数:163 n轮后开启的灯泡数: 12
灯泡数:164 n轮后开启的灯泡数: 12
灯泡数:165 n轮后开启的灯泡数: 12
灯泡数:166 n轮后开启的灯泡数: 12
灯泡数:167 n轮后开启的灯泡数: 12
灯泡数:168 n轮后开启的灯泡数: 12
灯泡数:169 n轮后开启的灯泡数: 13
灯泡数:170 n轮后开启的灯泡数: 13
灯泡数:171 n轮后开启的灯泡数: 13
灯泡数:172 n轮后开启的灯泡数: 13
灯泡数:173 n轮后开启的灯泡数: 13
灯泡数:174 n轮后开启的灯泡数: 13
灯泡数:175 n轮后开启的灯泡数: 13
灯泡数:176 n轮后开启的灯泡数: 13
灯泡数:177 n轮后开启的灯泡数: 13
灯泡数:178 n轮后开启的灯泡数: 13
灯泡数:179 n轮后开启的灯泡数: 13
灯泡数:180 n轮后开启的灯泡数: 13
灯泡数:181 n轮后开启的灯泡数: 13
灯泡数:182 n轮后开启的灯泡数: 13
灯泡数:183 n轮后开启的灯泡数: 13
灯泡数:184 n轮后开启的灯泡数: 13
灯泡数:185 n轮后开启的灯泡数: 13
灯泡数:186 n轮后开启的灯泡数: 13
灯泡数:187 n轮后开启的灯泡数: 13
灯泡数:188 n轮后开启的灯泡数: 13
灯泡数:189 n轮后开启的灯泡数: 13
灯泡数:190 n轮后开启的灯泡数: 13
灯泡数:191 n轮后开启的灯泡数: 13
灯泡数:192 n轮后开启的灯泡数: 13
灯泡数:193 n轮后开启的灯泡数: 13
灯泡数:194 n轮后开启的灯泡数: 13
灯泡数:195 n轮后开启的灯泡数: 13
灯泡数:196 n轮后开启的灯泡数: 14
灯泡数:197 n轮后开启的灯泡数: 14
灯泡数:198 n轮后开启的灯泡数: 14
灯泡数:199 n轮后开启的灯泡数: 14
灯泡数:200 n轮后开启的灯泡数: 14
发现第一轮开启灯泡数为1的灯泡个数是1~3,下一轮开启灯泡数为2的灯泡个数是4~8,以后灯泡数每增加上一轮的灯泡数+2,开启的灯泡数+1;即count(灯泡总数),first(上一轮的灯泡数),res(开启的灯泡数),
count+=first;
first+=2;
res++;
代码实现
class Solution {
public int bulbSwitch(int n) {
if(n<=0){
return 0;
}
if(n<=3){
return 1;
}
if(n<=8){
return 2;
}
int first=7;
int count=8;
int res=2;
while (count<n){
count+=first;
first+=2;
res++;
}
return res;
}
}