题目要求

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个初始状态为关闭的灯泡。第一次打开所有灯泡,第二次每隔一个灯泡关闭一个灯泡,第三次每隔两个灯泡按一下开关。依次类推,问第n次之后开着的灯泡的数量有几个?

思路和代码

首先举几个例子来找一下其中的规律。我们用0代表关闭的灯泡,1代表开启的灯泡:
n=1 1 1个
n=2 10 1个
n=3 100 1个
n=4 1001 2个
n=5 10010 2个
n=6 100100 2个
n=7 1001000 2个
n=8 10010000 2个
n=9 100100001 3个
...

可以看到,数量的变化发生于n为完全平方数的时候。

我们继续寻找为什么会出现这样的情况。
一个灯泡最后的状态,其实取决于它的因数的个数,比如2=1*2则第二个灯泡将在第一轮是被开启,在第二轮时被关闭。在比如8=1*8=2*4 则该灯泡会在第一轮时被开启,第二轮关闭,第四轮开启,第八轮关闭。因此8最后的状态也是关闭的。可见当其因数的个数为偶数时,该灯泡最终的状态必然是关闭的。那么什么时候会是开启,也就是其因数的个数为奇数呢?即该灯泡的位置为完全平方数的时候4=1*4=2*2,9=1*9=3*3。因此这道题目最终被转化为求n之前一共有多少个完全平方数。

    public int bulbSwitch(int n) {
        return (int) Math.sqrt(n);
    }

clipboard.png
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~


raledong
2.7k 声望2k 粉丝

心怀远方,负重前行