美文网首页
头条笔试题:点亮所有灯

头条笔试题:点亮所有灯

作者: 蓝天白云_Sam | 来源:发表于2019-02-18 23:03 被阅读0次

今天朋友发了一道头条面试题,如下:

坐标头条,昨天面试官面试算法。面试官出了这样一道题: 一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡的状态随机,按一个灯泡,相邻的两个灯泡的状态也发生一次变化。比如暗-亮-暗,按中间灯泡,变化为亮-暗-亮。问, 设计一道算法,使得所有灯泡最后都亮。

解题思路:

  • 依次关闭0到97所有已点亮的灯:如第i盏灯已经点亮,则按i+1盏灯,可将第i盏灯关闭
  • 剩下编号为98和99的两盏灯,分三种情况
    1. 只有一盏灯亮,假设为第i盏灯亮则从i + 2开始点,每隔三盏灯点一次直到全部点亮
    2. 两盏灯都亮,则再次点98号灯,此时97号灯亮,其它全灭,余下参考1.
    3. 所有灯全灭,此时依次点0-99号灯,最终所有灯全亮
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

/*
解题思路:

依次关闭0到97所有已点亮的灯:如第i盏灯已经点亮,则按i+1盏灯,可将第i盏灯关闭
剩下编号为98和99的两盏灯,分三种情况
1. 只有一盏灯亮,假设为第i盏灯亮则从i + 2开始点,每隔三盏灯点一次直到全部点亮
2. 两盏灯都亮,则再次点98号灯,此时97号灯亮,其它全灭,余下参考1.
3. 所有灯全灭,此时依次点0-99号灯,最终所有灯全亮
*/
void Check(vector<bool>& lights){
    for (auto i : lights) {
        assert(i == true);
    }
}

void Change(vector<bool>& lights,size_t const i){
    auto size = lights.size();
    auto index = size + i - 1;
    lights[(index % size)] = !lights[(index % size)];
    ++index;
    lights[index % size] = !lights[index % size];
    ++index;
    lights[(index % size)] = !lights[(index % size)];
}

void TurnOnAll(vector<bool>& lights){
    auto const size = lights.size();
    for (size_t i = 0; i < size - 2; ++ i) {
        if (lights[i] == true) {
            Change(lights,i+1);
        }
    }
    if (!lights[size - 1] && !lights[size - 2]) {//所有灯都关闭的情况
        for (size_t i = 0; i < size ; i++) {
            Change(lights,i);
        }
        return;
    }
    
    size_t onIndex = size - 1;
    if (lights[size - 1] == lights[size - 2]) {
        Change(lights, size -2);
        onIndex = size - 3;
    }else if(!lights[size - 1] ){
        onIndex = size - 2;
    }
    size_t end = onIndex + size;
    for (size_t i = onIndex + 2;  i < end; i += 3) {
        Change(lights, i);
    }
    Check(lights);
}

void PrintState(vector<bool> const& lights){
    for (size_t i = 0; i < lights.size(); ++i) {
        cout<<(int)lights[i];
        if (i%10 == 9) {
            cout<<endl;
        }
    }
}

int main(){
    vector<bool> lights(100);
    for (size_t i = 0; i < lights.size(); ++i) {
       lights[i] = (bool)(rand()%3); //注释掉该行可验证"所有灯都关闭的情况"
    }
    PrintState(lights);
    TurnOnAll(lights);
    cout<<endl;
    PrintState(lights);
    return 0;
}

相关文章

  • 头条笔试题:点亮所有灯

    今天朋友发了一道头条面试题,如下: 坐标头条,昨天面试官面试算法。面试官出了这样一道题: 一个圆环上有100个灯泡...

  • 灯点亮

    电路设计方案: 1,复位电路,对于复位电路来说,主要提供单片机复位引脚高电平和低电平,以实现复位和工作两种状态。显...

  • 颠覆世界|下弦集|玛格烈菊卦象_笔若的诗©

    立即阅读:颠覆世界|下弦集|笔若诗歌精选集 文/笔若没有任何玻璃能使我点亮一盏灯没有任何灯如同王冠一般急躁一场浪漫...

  • 我为什么要写作?

    文/北城故事 一盏灯,就足以点亮黑夜。一支笔,就足以让这静谧的...

  • 东方红

    盖世文豪手中笔,点亮心灯万万人。 文风淳厚启来者,同声齐绘太平村。 作者:杜小林。

  • Arduino入门

    1. 点亮板载led灯 2. 使用串口通讯,点亮led灯

  • 点亮心灯 点亮新年

    灯笼在中华民族悠久历史中,扮演着重要的角色,象征着中华文明的灿烂,也象征国家的昌盛繁荣。 在历史学家的考证中,中国...

  • 增广贤文(六十三)

    没钱的时候才戒酒,年纪老了才开始读经典。把七层高塔中的灯都点亮,还不如在黑暗处点亮一盏灯。奉劝人们在所有事情上都不...

  • 点亮般若灯

    打开一盏灯,它的光芒可以盛满整个屋子。翻开一本书,它的智慧可以点亮个人生活。 在仪征,图书馆是我这个异乡人的第二个...

  • 点亮心灯

    千年暗室,一灯烛照! 一瓣心香,至真至纯至清至洁。 点亮心灯 让亮光传向更远的地方 让前进的路上更有力量 让自己的...

网友评论

      本文标题:头条笔试题:点亮所有灯

      本文链接:https://www.haomeiwen.com/subject/mzrtyqtx.html