319. Bulb Switcher灯泡开关

初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
Example:
Input: 3
Output: 1
Explanation:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭].
你应该返回 1,因为只有一个灯泡还亮着。

【思路】
某个灯泡切换
1次是 开启
2次是关闭
3次是开启

===》奇数次是开启,偶数次是关闭
求灯泡切换次数奇数次的个数就是亮着的灯泡个数。
假设有n个灯泡 初始状态都是关闭状态00000000000…0
第一轮打开所有灯泡 11111111111…1
第二轮切换 第2 ,4 ,6,8 ,10…个 灯泡10101010101010…
第三轮切换 第3 ,6 ,9 ,12…个 灯泡100011100011 …

第i轮切换第 i*k (k = 1,2,3,4,)个灯泡。
所以每个灯泡被切换的次数就是它有多少个约数
6 = 3 2 ,6 = 16 ==》2 和3 1和6 都是6的约数,所以约数是成对出现的,但4 = 2*2 2 只算一个约数
若 i =a^2 ,则约数为奇数,即切换奇数次

class Solution {
public:
    int bulbSwitch(int n) {
       int  count  = 0;
        for(int i = 1; i*i <= n; i++)
            count++;
        return  count ;
    }
};

看到discuss里有直接开根的,意思是 如果 n/ i = i, 则 0< k < i ,都有 k^ 2 < n;即有 i 个数可以是k^2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值