leetcode319灯泡开关

leetcode319 Bulb Switcher

Posted by BY on August 21, 2018

前言

需要推导。

正文

问题来源

本问题来自leetcode上的319题。用go语言做的

问题描述

初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。

示例 :

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

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

分析:

初始状态灯泡全关,

第一轮,每1个灯泡状态变化一次,得到结果[on,on,on,on];第二轮,每2个灯泡状态变化一次,得到结果[on,off,on,off];第三轮,每3个灯泡状态变化一次,得到结果[on,off,off,off];第四轮,每4个灯泡状态变化一次,得到结果[on,off,off,on]

经过上面的分析,相信你也有了一定的思路。假如灯泡数量为10个,那么对于第4个灯泡,它被改变的状态分别处于第几轮呢?

很显然,4 = 1 * 4(第一轮)、4 = 2 * 2 (第二轮)、4 = 4 * 1(第四轮),经过3三轮状态变化过后,第四盏灯状态将是开启的。我们可以看出一个规律,对于平方数,它的最后状态总是 on 的,因为其他因数都是成对出现的,那么只要求出 n 之内的平方数个数就可以得到结果: 本人写的Go代码如下:

func bulbSwitch(n int) int {
    //要注意go语言的强制转换和C不太一样
    return int(math.Sqrt(float64(n)))
}

总结:

勤思考

结语

闲来无事的话,多练习练习,做做题。