0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

有趣的算法题热热身:灯泡开关

算法与数据结构 来源:牛牛码特 作者:牛牛码特 2022-06-16 09:30 次阅读
计算机基础和算法是能否拿到一个好offer的关键因素,月底牛牛就忙完手上项目了,到时也会多分享相关内容,今天就先整一道LeetCode上有趣的算法题热热身:灯泡开关。 01故事起源

初始时有 n 个灯泡,均处于关闭状态。

对某个灯泡切换开关意味着:如果灯泡状态为关闭,那该灯泡就会被开启;而灯泡状态为开启,那该灯泡就会被关闭。

第 1 轮,每个灯泡切换一次开关。即打开所有的灯泡。

第 2 轮,每两个灯泡切换一次开关。即每两个灯泡关闭后一个。

第 3 轮,每三个灯泡切换一次开关。即位于第3、6、9···的灯泡切换开关。

第 i 轮,每 i 个灯泡切换一次开关。而第 n 轮,你只切换最后一个灯泡的开关。

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

示例 1:

2e2f0c3e-ed13-11ec-ba43-dac502259ad0.png

输入:n = 6 输出:2

02问题分析

通过上面的图例,我们可以很清楚地看到,每一轮都会切换一批灯泡。关键是可能切换到之前已经切换过的灯泡,如果我们通过模拟来暴力解决,那么每一轮就要遍历一次,肯定超时。

那我们换种思路想想,这道题似乎更像一道有数学规律的题,这种类型在面试中也不少见。

不过我们不一定能马上找到规律,那也不要着急,就按部就班:用0表示off, 1表示on,先列出前10个灯泡的答案,看看其中有什么规律可循。

n=1:1

n=2:1 0

n=3:1 0 0

n=4:1 0 0 1

n=5:1 0 0 1 0

n=6:1 0 0 1 0 0

n=7:1 0 0 1 0 0 0

n=8:1 0 0 1 0 0 0 0

n=9:1 0 0 1 0 0 0 0 1

n=10: 1 0 0 10 0 0 0 1 0

03发现规律

我们仔细看看上面的数据就会发现,最后亮灯的位置都在第1、4、9位上,这些位置恰好都是某个因子的平方,比如4,就是2的平方,不知道大家还记得不,在数学上这种数字就叫做完全平方数

那我们就可以大胆猜测:最后亮灯的位置,都是完全平方数。那么每多一个完全平方数,就多一个亮的灯泡。

当然,这只是一个猜测,我们可以用暴力法写一个程序,把前100个的情况打印出来,就能看出,是满足这个规律的。

都已经验证到100轮了,那么基本就是这个规律了。

所以这道题,其实就是寻找n以内有多少个完全平方数,具体做法是从数字1遍历到数字n,对每个数字判断是否是完全平方数,最差也是O(n)可以解决。

04思考缘由

牛牛是个打破砂锅问到底的人,虽然通过规律,解决了问题,但是不搞清楚为什么,总是心里痒痒的。

我们从上面的规律,可以猜测灯泡亮的数量一定和平方根的特性有关系的。

我们先看看一些非完全平方数:

8的因子: 1 2 4 8;

12的因子:1 2 3 4 6 12;

这些因子一定是偶数个,为什么呢?

因为一个因子,一定是和另一个因子,配合起来,才能得到这个数字。

回到我们的灯泡,比如我们拿n=3的情况来说,第一轮打开了第三轮的灯泡,第三轮就会给它关掉,因为1、3是3的成对因子。

但如果是n=4的情况,1、4虽然也会成对抵消,但是第二轮的操作却无法抵消,因为2的成对因子是2,不会再重复出现。

从这里我们就可以看出来,每增加一个完全平方数,就会多一个不会被抵消掉的因子出现,所以个数也就增加了1。

05更进一步

一般的算法题,O(n)就是性能的极致,但这是一道数学规律题,那我们就得多想想还有没有更快的办法。

要找到有多少个完全平方数,是否一定要遍历完1-n?

稍微思考下就可以发现并不是,拿9举个:3是9的完全平方因子,在3以上的数字一定不能构成完全平方因子,因为开平方一定超过最大数字9了。如此一来,我们只用考虑3之前的。

不难发现,3之前的1、2是必然满足完全平方因子的,因为它们做平方,一定小于3的平方,也就一定在数据范围内。

基于上面的分析,我们可以看出,灯泡亮的个数,就是n的平方根向下取整个,代码就一行:

return (int)Math.sqrt(n)

06灯泡复盘其实在面试中,遇到这种数学模型的题,是很容易翻车的。如果只是干想,在面试紧张的环境下,很可能大脑一片空白。 不过,这种题的套路也是有的,基本都可以用先实验,再猜测,再论证的方式去解决,这个不仅仅是面试套路,也是一种很优秀的做事情的模式。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4587

    浏览量

    92478
  • 程序
    +关注

    关注

    116

    文章

    3754

    浏览量

    80738

原文标题:LC319:灯泡开关

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    用高端开关驱动灯泡负载

    电子发烧友网站提供《用高端开关驱动灯泡负载.pdf》资料免费下载
    发表于 09-24 09:33 0次下载
    用高端<b class='flag-5'>开关</b>驱动<b class='flag-5'>灯泡</b>负载

    短文6:关于功率因素的有趣问答

    2个关于功率因素的有趣问答。
    的头像 发表于 09-23 12:22 147次阅读

    判断灯泡亮度的主要依据是什么

    判断灯泡亮度的主要依据是其发光强度,通常用流明(Lumen)来衡量。 灯泡亮度的判断标准 灯泡作为家庭和商业照明的重要工具,其亮度直接影响到人们的生活和工作环境。选择合适的灯泡亮度,可
    的头像 发表于 08-15 17:05 1260次阅读

    灯泡亮度由电流还是电压决定

    灯泡的亮度主要由灯泡的实际功率决定,而非单一的电流或电压。以下是对这一结论的介绍: 一、实际功率的作用 灯泡的亮度取决于其实际功率,即灯泡在工作时单位时间内消耗的电能转化为光能和内能的
    的头像 发表于 08-15 17:04 2075次阅读

    维修电源板时串个灯泡有什么用

    在维修电源板时,串接一个灯泡具有多重作用,主要体现在以下几个方面: 1. 保护电源和电路 防止短路损坏 :当电源板存在短路故障时,串接的灯泡可以起到限流的作用,防止过大的电流通过故障点,从而保护电源
    的头像 发表于 08-15 16:26 1354次阅读

    思尔芯赛正式发布,邀你共战EDA精英挑战赛!

    全新的挑战。今年的赛,我们更加聚焦于数字集成电路设计的核心领域,直击当前超大规模设计下硬件仿真的技术难点:设计并优化一种高效的超图分割算法。该技术可以加速设计验
    的头像 发表于 08-03 08:24 474次阅读
    思尔芯赛<b class='flag-5'>题</b>正式发布,邀你共战EDA精英挑战赛!

    想搞懂通信协议?先来看一篇SPI热热身

    SPI是串行外设接口(SerialPeripheralInterface)的缩写,它是一种同步串行通信接口,用于微控制器和外围设备(如传感器、SD卡、其他微控制器等)之间的通信。SPI接口通常用于短距离通信,因为它不支持长距离传输。SPI接口的特点包括:全双工通信:SPI允许数据同时在两个方向上传输,即主机可以发送数据到从机,同时从机也可以发送数据到主机。高
    的头像 发表于 05-12 08:10 1484次阅读
    想搞懂通信协议?先来看一篇SPI<b class='flag-5'>热热身</b>

    单品解读JL-3系列之JL-311A烛台灯座式电子光控开关

    JL-311A烛台灯座式电子光控开关,适用于根据环境照明水平自主控制烛台灯泡
    的头像 发表于 02-19 16:20 401次阅读
    单品解读JL-3系列之JL-311A烛台灯座式电子光控<b class='flag-5'>开关</b>

    测量小灯泡的电功率多次测量的目的

    测量小灯泡的电功率是一种实验方法,旨在确定小灯泡在使用电能时所消耗的具体功率值。这种实验方法对于研究和应用电能的使用和调节具有重要意义。下面我们将详细探讨为什么需要多次测量小灯泡的电功率以及目的
    的头像 发表于 01-18 16:46 1950次阅读

    继电器接灯泡怎么接线

    继电器是一种用来控制电路的装置,常用于家庭及商业照明系统中,用于控制灯泡开关。继电器通过改变电路中的电流流向,从而实现对灯泡的控制。在接线继电器和灯泡之前,需要明确继电器的类型以及其
    的头像 发表于 01-17 11:21 2972次阅读

    双控开关控制一个灯怎么接线

    ,包括双控开关、灯座、灯泡、电线、电缆套、绑线带、螺丝刀和剥线钳。 接下来,我们需要了解双控开关的基本结构和功能。一般来说,双控开关由两个开关
    的头像 发表于 01-17 11:19 2300次阅读

    led灯泡芯片推荐:SM2082EGS 电流可达 100mA

    led灯泡芯片推荐:SM2082EGS 电流可达 100mA
    的头像 发表于 01-05 14:28 704次阅读
    led<b class='flag-5'>灯泡</b>芯片推荐:SM2082EGS 电流可达 100mA

    恒流led灯泡如何实现调光

    恒流LED灯泡调光的实现方法有多种,包括PWM(脉宽调制)、PAM(脉幅调制)、DAC(数字模拟转换)、TRIAC(双向可控硅调光)等。下面,我将详细介绍每种方法的原理、优缺点以及应用场景。 PWM
    的头像 发表于 12-22 13:57 2286次阅读

    有趣的光耦振荡器

    有趣的光耦振荡器
    的头像 发表于 11-23 09:09 825次阅读
    <b class='flag-5'>有趣</b>的光耦振荡器

    直流灯泡与交流灯泡在相同电压下互换可以正常工作吗?

    最近看到一个很有意思的问题,直流灯泡与交流灯泡在相同电压下互换可以正常工作吗?我相信很多人曾经多多少少有过这个疑问,今天我们就简单谈论一下这个问题。
    的头像 发表于 11-13 15:44 1039次阅读
    直流<b class='flag-5'>灯泡</b>与交流<b class='flag-5'>灯泡</b>在相同电压下互换可以正常工作吗?