LeetCode: Bulb Switcher

题目:

英文: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 nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.

中文:现有n个灯泡,默认都是关闭的。第一轮会打开所有的灯泡,第二轮关闭所有偶数次序的灯泡,第三轮翻转所有次序为三的倍数位置的灯泡,直到第n轮拨动最后一个灯泡的开关。试确定第n轮后还有几盏灯是亮的。

解题思路:设灯泡为一个长度为n的数组

1.第一轮开启所有灯泡
2.第二轮toggle所有编号为2的倍数的灯泡
3.第三轮toggle所有编号为3的倍数的灯泡
……
由以上分析可知,对于编号为k的灯泡,只有遇到k的因子时,灯泡才会被toggle。如k=6,6=1*6,6=2*3,即在第一轮,第二轮,第三轮,第六轮灯泡会被toggle。所以,只有k的因子为奇数个时,灯泡的最终状态是点亮的。

现在的问题转换为:求数组中因子为奇数个的元素个数。

我们知道,对于k,他的因子除了1和k之外,假设存在因子p,那么一定存在q,使得p*q=k,即因子一定是成对出现的。除非p=q,当p=q时,k一定是个完全平方数。

所以,问题又转换成了:求数组中完全平方数的个数。而要计算一个数之下有多少小于或等于它的平方数,使用一个开平方用的函数就可以了。

代码:

class Solution(object):
    def bulbSwitch(self, n):
    """
    :type n: int
    :rtype: int
    """
        return int(math.sqrt(n))

你可能感兴趣的:(LeetCode)