字节跳动某面试官的压箱题——灯泡开关
Posted Big sai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节跳动某面试官的压箱题——灯泡开关相关的知识,希望对你有一定的参考价值。
大家好,我是一个搬砖的胖子。
今天分享的题很有意思,大家学会了可以跟周围朋友吹牛了。
(我和室友吹了半天 hhh )
经过全网搜索,发现这道题字节跳动 19 年 2 月就考过。最近又常出现在字节的三面,看来是面试官压箱底的题。
这道题有些难度,但相信大家看完答案就明白了~
题目描述
一个圆环上有 100 个灯泡,灯泡有亮和暗两种状态。按一个灯泡的开关可以改变它和与它相邻两个灯泡的状态。
设计一种算法,对于任意初始状态,使所有灯泡全亮。
参考答案
将灯泡编号 1 ~ 100
步骤一:将灯泡变为全亮或只剩一个为暗
从 1 循环到 98 ,遇到暗的则按它下一个,使之变亮。循环完毕,1 ~ 98 必然全亮。99 和 100可能为亮亮、暗亮、亮暗、暗暗四种状态。
若为亮亮,皆大欢喜,满足题目要求
暗亮、亮暗,达到只剩一个为暗的状态;
若为暗暗。则按下编号 100 的灯泡,使编号 99 、100 变为亮,编号 1 的灯泡变为暗,从而达到只剩一个为暗的状态。
步骤二:将灯泡变为全暗
由于灯泡环形摆放,我们指定暗的灯泡编号为 1 ,将剩下 99 个亮着的灯泡每 3 个为一组。按下每组中间的灯泡后,使得所有灯泡变为暗。
步骤三:将灯泡变为全亮
将所有灯泡按一下,灯泡变为全亮。
扩展
对于 N 个灯泡的任意初始状态 ( N > 3 ) ,能否经过若干次操作使得所有灯泡全亮?
答案:N 个灯泡做分类讨论。
N = 3*k+1
一定可以。方法与上述步骤相同,在步骤二中可以将3k个亮的灯泡分为k组。N = 3*k+2
一定可以。将上述步骤一目标状态的只剩一个为暗改成剩两个相邻为暗,其余 3 * k 个灯泡分组按即可。因为,对于任意只剩一个为暗的状态,按下该灯泡左右任意一个就可以变成剩两个相邻为暗的状态!N = 3*k
不一定。如果经过上述步骤一可以将灯泡变成全亮的状态则有解;否则,无解。(该结论有待证明)
附
对于这道题,以下两个状态可以相互转化
大家可以琢磨下,对理解这道题会有帮助。
全暗 <=> 全亮。全暗和全亮状态可以相互转化,方法就是将每个灯泡按一次。这样每个灯泡都被改变了 3 次状态,使得全暗变为全亮,全亮也可变为全暗。
剩一个为暗 <=> 剩两个相邻为暗。剩一个为暗时,按下该灯泡左右任意一个,就变成了剩两个相邻为暗的状态;剩两个相邻为暗时,按下第二个暗,便可变成了剩一个为暗的状态。
参考文献
脉脉@计无施
点击阅读全文查看 CodeTop 大厂面试题库
以上是关于字节跳动某面试官的压箱题——灯泡开关的主要内容,如果未能解决你的问题,请参考以下文章