[Leetcode] 319. Bulb Switcher

来源:互联网 发布:网络弊大于利反方辩词 编辑:程序博客网 时间:2024/05/22 12:44

题目:
There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the ith round, you toggle every i bulb. For the nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.

Example:

Given n = 3. At first, the three bulbs are [off, off, off].After first round, the three bulbs are [on, on, on].After second round, the three bulbs are [on, off, on].After third round, the three bulbs are [on, off, off]. So you should return 1, because there is only one bulb is on.

题目大意:
开始有n盏灯处于off状态:
第1轮:将所有的灯变为on状态
第2轮:把所有是2的倍数的灯转变状态(on的变为off,off的变为on),即:把所有2的倍数的灯转变为off状态。
第3轮:把所有是3的倍数的灯转变状态(on的变为off,off的变为on);
·
·
·
第n轮:把所有是n的倍数的灯转变状态。

分析:对第i盏灯来说,改变状态的次数,是它所有因子的个数之和,如对第4盏灯,4的因子分别是1,2,4 ,第4盏灯改变的次数是3次,即off->on->off->on结果是on,
对第i盏灯若最终状态是on的话,因子个数应该是奇数。
第i盏灯若最终状态是off的话,因子个数应该是偶数。

又因为只有完全平方数的因子是奇数个。(4—-1,2,4 ; 4=2*2)原因是出了完全平方数其余的因子都是成对出现的。而完全平方数的平方根只会统计一次。
那么问题就简化为了求1到n之间完全平方数的个数。

代码实现:
public int bulbSwitch(int n) {
return (int)Math.sqrt(n);
}

0 0
原创粉丝点击