关于网易2018实习生招聘的“道路布灯”问题

   昨天参加了网易在线评测,总体感觉还是比较刺激的,这算是笔者的第一次在线笔试吧,然后总体的感觉就是自己的知识还是太不足了,需要大量的积累才能“厚积薄发”,算了,废话不多说,直接上我遇到的这个“道路布灯”问题。

一条道路上有n格格子,每一个格子上都是一块区域,其中对于每一块格子,用x表示是亮着,不需要使用路灯,而对于.表示的是黑暗的,需要使用路灯将其照明,而对于布置在pos位置上的路灯,能够照亮pos - 1 和pos + 1 这个范围内的距离,给定一条道路上的情况,试给出最少的布灯数量。

例,输入xxx.x.xx...x.x.

输出应当为 一个整数 3

   老实说,刚开始拿到题目的时候。是一脸懵逼的,真的是一点思路都没有,然后紧紧的想了那么几分钟,看到时间也不够了,就索性放弃了。后来完事儿之后,再次拿起这个题目,思路就来了。。。怪事儿。。。

  说说我的思路吧,我的想法是因为道路的情况相当于是一个输入的string类型,而这个string类型,我们就是需要寻找一个最小的灯的数量,然后将整条道路照明,而每个路灯的照明范围是3,因此我的想法是,我弄一个宽度为3的窗口,然后在这条道路上滑动窗口,为了使得路灯最小,

  那么我可以对窗口的最左端的那个元素进行判断——

  • 如果它已经不需要照亮,那么我们直接将窗口向右移动一格,
  • 如果需要照亮,因为一盏灯的能够照明3格,所以直接将窗口向右移动3格。

  那么依照,这个思路,我开始写代码:

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char const *argv[])
{
    string inputStr;

    int count = 0;

    cin >> inputStr;

    for (int pos = 0; pos < inputStr.size(); )
    {
        // 如果三个中的最左边的那个不可点亮,那么就直接右移一格
        if (inputStr[pos] == 'x')
        {
             ++ pos;
        }
        // 剩下的采用类似滑动窗口的思想进行代码的书写
        else if (inputStr[pos] == '.')
        {
            // cout << pos << endl;
            pos += 3;
            ++ count;
        }
    }

    cout << count << endl;


    return 0;
}

   运行结果如下:


xx...x..x...                         

 3  

....x.x.x.x.           

4  
发布了24 篇原创文章 · 获赞 32 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_36752072/article/details/79723863