题目:

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

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

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

Java开关灯程序 java灯泡开关_取整

输入:n = 3
输出:1
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭].

你应该返回 1,因为只有一个灯泡还亮着。
示例 2:

输入:n = 0
输出:0
示例 3:

输入:n = 1
输出:1
 

提示:

0 <= n <= 109

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bulb-switcher
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

n个灯泡要执行n轮灯泡状态的变换

1.灯泡什么时候才是 [亮] 的状态?----变换的次数为奇数次。

2.什么情况会改变第 i 个灯泡的开关?--- 当轮数k是 i 的约数时才会改变第 i 个灯泡的状态。

例如:

i = 4,只有第1,2,4会切换第4个灯泡的状态,所以最后第4个灯泡的状态是开,因为它做了奇数次的变换;

i = 8,只有1,2,4,8会切换第8个灯泡的状态,所以最后第8个灯泡的状态是关,因为它做了偶数次的变换。

因此就可以发现像4,9,16...这种完全平方数的约数就为奇数个(9 = 1x9=3x3,对于约数3来说,出现了两次所以忽略一次,故把9的约数看成3个,而不是4个),从而该题就可以转变为求:小于等于n的数中完全平方数的个数,即完全平方的个数为⌊√n⌋(⌊n⌋ 表示向下取整)最后灯泡亮着的个数为⌊√n⌋。

代码:

1 class Solution {
2     public int bulbSwitch(int n) {
3         return (int) Math.sqrt(n);
4     }
5 }

Java开关灯程序 java灯泡开关_取整_02