题意描述:给定n个灯泡,初始化全为off,第一趟全问部on,第二趟将每第二个off,第三趟将每第三个反转……第n趟将第n个反转,最后返回灯泡处于on的数目。给定n=3,则有以下过程:
开始时,3个灯泡[off, off, off];第一轮,3个灯泡[on, on, on];第二轮,3个灯泡[on, off, on];第三轮,3个灯泡[on, off, off]。所以最后返回1
解题思路一:该方法最容易想到,就是依次判断各个灯泡的最终状态,然后返回灯亮的个数。可以发现当n=1,2,3时都返回1;从4开始,依次判断当前灯是否亮,如果亮则计数加1
int bulbSwitcher(int n) {
if(n <= 0)
return 0;
int res = 1;
for(int i=4; i<=n; i++){
if(isOn(i))
res++;
}
return res;
}
boolean isOn(int k){//判断第k个灯是否亮着
//判断的方法就是从2到当前数k,如果出现k的因子,则其状态反转一次
boolean flag = true;
for(int i=2; i<=k; i++){
if(k % i == 0)
flag = !flag;
}
return flag;
}
解题思路二:上面的解题思路没有用到灯泡数n与反转次数的关系,从而导致了当n过大时运行超时,观察上面运行的结果:[1,3]---1; [4,8]---2; [9,15]---3; [16,24]---4; [25,35]---5;……发现从[i,i*(i+2)]---i
int bulbSwitcher2(int n){
if(n <= 0)
return 0;
else
return (int)Math.sqrt(n);
}