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;
}