字节跳动某面试官的压箱题——灯泡开关

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 个灯泡做分类讨论。

  1. N = 3*k+1一定可以。方法与上述步骤相同,在步骤二中可以将3k个亮的灯泡分为k组。

  2. N = 3*k+2一定可以。将上述步骤一目标状态的只剩一个为暗改成剩两个相邻为暗,其余 3 * k 个灯泡分组按即可。因为,对于任意只剩一个为暗的状态,按下该灯泡左右任意一个就可以变成剩两个相邻为暗的状态!

  3. N = 3*k不一定。如果经过上述步骤一可以将灯泡变成全亮的状态则有解;否则,无解。(该结论有待证明)

对于这道题,以下两个状态可以相互转化

大家可以琢磨下,对理解这道题会有帮助。

  1. 全暗 <=> 全亮。全暗和全亮状态可以相互转化,方法就是将每个灯泡按一次。这样每个灯泡都被改变了 3 次状态,使得全暗变为全亮,全亮也可变为全暗。

  2. 剩一个为暗 <=> 剩两个相邻为暗。剩一个为暗时,按下该灯泡左右任意一个,就变成了剩两个相邻为暗的状态;剩两个相邻为暗时,按下第二个暗,便可变成了剩一个为暗的状态。

参考文献

  1. 脉脉@计无施

点击阅读全文查看 CodeTop 大厂面试题库

以上是关于字节跳动某面试官的压箱题——灯泡开关的主要内容,如果未能解决你的问题,请参考以下文章

2019 字节跳动java面试笔试题 (含面试题解析)

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

在字节跳动我是如何当面试官的,BAT大厂面试总结

作为一个Java程序员,双非本科字节跳动Java面试题分享

想要内推字节跳动的同学看过来(含内推方式)

字节跳动Java面试挂了以后,流泪总结了这份大厂常问面试题