漫画:骚操作系列(灯泡开关的经典面试题)

昨天的排版简直逊爆了,让我很不满意!小浩作为一个处女座,追求完美是必须的。所以呢,今天的文章进行了多次的审阅才发出(当然,如果大家还觉得很丑。那我也只能再继续努力。毕竟我不是一个专业的美工。另外,今天的二维码很酷炫有木有?)

今天为大家分享一道关于“电灯泡的题目。

话不多说,直接看题。

01

第319题:开关灯泡

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

示例:

输入: 3

输出: 1 

解释: 

初始时, 灯泡状态 [关闭, 关闭, 关闭].

第一轮后, 灯泡状态 [开启, 开启, 开启].

第二轮后, 灯泡状态 [开启, 关闭, 开启].

第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 

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

(只要一瞪,就会了)

02

题目分析

这是一道难度评定为困难的题目。但是,其实这并不是一道算法题,而是一个脑筋急转弯。只要我们模拟一下开关灯泡的过程,大家就会瞬间get,一起来分析一下:

我们模拟一下n从1到12的过程。在第一轮,你打开了12个灯泡:

因为对于大于n的灯泡你是不care的,所以我们用黑框框表示:

然后我们列出n从1-12的过程中所有的灯泡示意图:

可以得到如下表格:

观察一下,这是什么?观察不出来,咱们看看这个:

1//go
2func main() {
3    for n := 1; n <= 12; n++ {
4        fmt.Println("n=", n, "\t灯泡数\t", math.Sqrt(float64(n)))
5    }
6}
//print
n= 1     灯泡数  1
n= 2     灯泡数  1.4142135623730951
n= 3     灯泡数  1.7320508075688772
n= 4     灯泡数  2
n= 5     灯泡数  2.23606797749979
n= 6     灯泡数  2.449489742783178
n= 7     灯泡数  2.6457513110645907
n= 8     灯泡数  2.8284271247461903
n= 9     灯泡数  3
n= 10     灯泡数  3.1622776601683795
n= 11     灯泡数  3.3166247903554
n= 12     灯泡数  3.4641016151377544

没错,只要我们对n进行开方,就可以得到最终的灯泡数。根据分析,得出代码:

//给一个c++版本的
class Solution {
public:
    int bulbSwitch(int n) {
        return sqrt(n);
    }
};

郑重申明(读我的文章必看):

  • 本系列所有教程都不会用到复杂的语言特性,大家不需要担心没有学过相关语法,使用各语言纯属本人爱好,毕竟我是一个博爱的人,需要雨露均沾。

  • 作为学术文章,虽然哥的风格很风趣,但是所有代码均在leetcode上进行过测试运行。严谨,我是认真的。

  • 最后,请记住,算法思想才是最重要的!

03

证明

我不服,没有证明,你说毛线!证明如下:

约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。

从我们观察可以发现,如果一个灯泡有奇数个约数,那么最后这个灯泡一定会亮着。

什么,你问我奇数是什么?奇数(odd)指不能被2整除的整数 ,数学表达形式为:2k+1, 奇数可以分为正奇数和负奇数。

所以其实我们是求,从1-n有多少个数的约数有奇数个。而有奇数个约数的数一定是完全平方数。这是因为,对于数n,如果m是它的约数,则n/m也是它的约数,若m≠n/m,则它的约数是以m、n/m的形式成对出现的。而m=n/m成立且n/m是正整数时,n是完全平方数,而它有奇数个约数。

我们再次转化问题,求1-n有多少个数是完全平方数

什么,你又不知道什么是完全平方数了?完全平方指用一个整数乘以自己例如1*1,2*2,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数

到这里,基本就很明朗了。剩下的,我想不需要再说了吧!

所以,今天的问题你听明白了吗?评论区留下你的想法吧!

"要进学习群的小伙伴记得加我,和小浩做朋友"

左侧为私人名片,右侧为公号名片

加我之前怎么得关注一下吧

长按扫一下

这个二维码是我用PS+Python做的

酷不酷炫

关注领取一套算法教程+《图解算法》

发现了吗?近日小浩已经将所有的广告都关掉了!也就是说,所有的文章,对我一点收入都不会有。我唯一想要的,就是大家可以顺手帮我转发,足够我高兴一整天。这也是支持我一直写下去的动力,感谢你。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值