1. 程式人生 > >【筆試總結】網易2019校招編程題-玩你媽的橡皮泥

【筆試總結】網易2019校招編程題-玩你媽的橡皮泥

nbsp 三種 順序 bubuko 環形隊列 什麽 復雜度 問題 ++

題目我就不多說什麽了,橡皮泥,一串橡皮泥哦。

非黑即白。

小明可以采取以下方法0或多次:

從某一處切割,讓切割處左右隊列內兩條橡皮泥整個發生反轉,再拼接到一起。

輸入:

橡皮泥隊列

輸出:

最長的黑白相間的橡皮泥長度

樣例輸入:

bwbwb

樣例輸出:

5

分析:

從某一處截斷之後,兩邊同時反轉,相當於如果把每個橡皮泥比作一個球,放在一個環裏,從某一處截斷後,倒置環,球又滾到一起拼接起來,我還特意畫了個圖演示。

技術分享圖片

不知道讀者看懂了沒,反正我是看懂了,那我們接著往下講。

就圖上這個圓圈來說,我們來推導一個極端的情況,就是圈內所有的球球都填滿了。這時候會發生什麽呢?我覺得玩過這種玩具的熊孩子都應該知道,那就是——

無論你怎麽插,怎麽動,她都不會有一點反應。這就對了。

這是極端情況,代表的是,如果這個bw串首尾相接,那麽就算小明插∞次,整個隊列情況不會有絲毫改變,問題就變成了:

已知一個環形由b或w組成的串,求其中最長的bw相間的子串長。問題簡單了不?

好,可能字符串首尾相接在計算機中不太好表示,其實我數據結構是真的渣,所以我還得繼續簡化:

對一個已知的環形隊列,進行上述的“分割並反轉”操作,能夠包括所有分割可能的線性隊列是什麽樣的?我們再來看圖。

技術分享圖片

圖上分別列出了三種分割後進行倒轉產生的新隊列。以此類推,所有的分割情況產生的新隊列,無非是上圖右側隊列的【一個子隊列】

而上圖右側這個隊列,剛好是原始隊列的X2!

這樣,原問題便轉換為:

已知一個長為X的隊列,由b或w拼接成。現求相同的兩個X隊列順序拼接後,其中長為X的順序子序列內,能出現的最長bw相間的序列長度。

源代碼:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 int max(int a,int b) {
 7     if (a >= b) return a;
 8     else return b;
 9 }
10 int main() {
11     string s;
12     cin >> s;
13 s += s; 14 int ans = 1; 15 for (int i = 0; i < s.size(); i++) { 16 int j = 1; 17 while (i != s.size() - 1 && s[i] != s[i + 1]) { 18 i++; 19 j++; 20 } 21 ans = max(ans, j); 22 } 23 if (s.size() / 2 < ans) { 24 ans = s.size() / 2; 25 } 26 printf("%d\n", ans); 27 return 0; 28 }

時間復雜度:其中一個主要循環,受制參數為s.size(),所以時間復雜度為o(|S|),|S|為串長。

玩你媽的橡皮泥。

【筆試總結】網易2019校招編程題-玩你媽的橡皮泥