Leetcode319.灯泡开关

462 阅读1分钟

初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭一个。

第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。

找出并返回 n 轮后有多少个亮着的灯泡。

示例1:

image.png

image.png

思路: 题意说ii 轮改变所有编号为 ii 的倍数的灯泡,最后找到亮的灯泡。。可转化为 [1,n][1,n] 内有多少个数的约数为奇数。我们知道约数的个数是成对存在的,如果存在一个数 kkxx 的约数,那么 xk\frac{x}{k}也是它的约数,既然要找到约数的个数是奇数个,那么这个数一定是完全平方数。即题意可转化为 [1,n][1,n] 中有多少个完全平方数。根据数论 [1,n][1,n] 中有 n\sqrt n 个完全平方数。

代码:

/**
 * @param {number} n
 * @return {number}
 */
var bulbSwitch = function(n) {
   return parseInt(Math.sqrt(n));
};