關於網易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  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章