public static int bulbSwitch(int n) {
int num = 1;
//暴力求解方法超时
// int[] bulb = new int[n];
//
//
// for(int i = 1 ; i <= n ; i++){
// if(i == 1){
// for(int j = 0 ; j < n ; j++)
// bulb[j] = 1;
// num = n;
// }else if(i == 2){
// for(int k = 0 ; k < n ; k++){
// if(k % 2 == 1){
// bulb[k] = -1;
// num--;
// }
// }
// }else {
// for(int l = 0 ; l < n ; l++){
// if(l % i == i - 1){
// bulb[l] = -bulb[l];
// if(bulb[l] == 1)
// num++;
// else
// num--;
// }
// }
// }
// }
//第k盏灯亮暗情况为k轮下来灯泡反转的次数
//为 1 ~ K 中 K 的因子个数 偶数时为暗 奇数为亮
//由于 K / i = j(整除关系) 所以 i 和 j 都为 K 的因子 如 K / 1 = K
//所以可以知道 K 的因子总是成对存在的
//但有一种情况 即 K / i = j 且 i = j 时 K 的因子只有一个 即 i = j
//综合上面说的两种情况 只有存在 i = j 时K 在 1 ~ K 里面的因子数为奇数 不存在则为偶数
//所以问题被转换为 K 是否可以被开根号(开根号后为整数)
//即 第K盏灯能被开根号 K轮后就为亮的
//转换为 1 ~ K 中有多少个整数能被开根号就有多少个亮的灯
//实际上我们可发现((√K)+1)*((√K)+1) > K 而 ((√K)-i)*((√K)-i) < K
//所以我们可以知道 √K 之前 有 √K 个数可以被开根号
//如 K = 9 √K = 3 那么1 ~ K 中能被开根号的数都在 1 * 1 , 2 * 2 , 3 * 3
//因为 4 * 4 > 9 不在 1 ~ K 的范围内 所以4不行
//最终我们要求的实际上就是 return Math.sqrt(K);
if(n == 0 )
return 0;
for(int i = 2 ; i <= n ; i++){
int s = (int)Math.sqrt(i);
if( s * s == i )
num++;
}
return num;
}