題目描述
小魚兒吐泡泡,嘟嘟嘟冒出來。小魚兒會吐出兩種泡泡:大泡泡"O",小泡泡"o"。
兩個相鄰的小泡泡會融成一個大泡泡,兩個相鄰的大泡泡會爆掉。
(是的你沒看錯,小氣泡和大氣泡不會產生任何變化的,原因我也不知道。)
例如:ooOOoooO經過一段時間以後會變成oO。
輸入描述:
數據有多組,處理到文件結束。
每組輸入包含一行僅有’O’與’o’組成的字符串。
輸出描述:
每組輸出僅包含一行,輸出一行字符串代表小魚兒吐出的泡泡經過融合以後所剩餘的泡泡。
輸入
ooOOoooO
輸出
oO
說明
自左到右進行合併
備註:
對於100%的數據,
字符串的長度不超過100。
思路
看完題目第一個想法:搞個棧不就完事了嘛
然後就wa了 雖然確實WA了但是這個鍋 棧不背。。。
思路是這樣:
對輸入的字符串中字符從前往後逐一判斷,若不滿足匹配條件(小o匹配小o或者大O匹配大O)就push進行下一次判斷。
而匹配與否則看當前棧頂元素與當前字符是否相等,相等則匹配,則pop彈出棧頂元素,再進一步考慮爆炸(不再進一步操作)還是聚合成大泡泡(push一個大O)
特別注意遇到小o小o聚合的情況,需要在pop棧頂那個小o之後,再特判一下此時的棧頂元素是否大O,是的話就能匹配上剛剛倆小o聚合的大O,需要爆炸,即直接彈出棧頂的大O。於是輸入字符串ch以後對ch逐位檢查的代碼如下:
if( !st.empty() && st.top() == ch[i] ){
if( ch[i] == 'O' ){//兩個大泡泡爆炸
st.pop();
}
else if( ch[i] == 'o' ){//兩個小泡泡合成大泡泡
st.pop();
if( !st.empty() && st.top() == 'O')//合成大泡泡要注意原來是否還有大泡泡
st.pop();
else
st.push('O');
}
}
else
st.push(ch[i]);
i++;
然後就wa了。對。但是我不是在浪費你的時間,代碼和思路都沒啥毛病。
我花了一天時間整明白,一定要注意題目中的細節比如這題數據有多組,處理到文件結束。
意思是隻接受一組輸入是不會通過的。。。完整代碼:
#include<iostream>
#include<stack>
using namespace std;
int main(){
char ch[105];
stack<char> st;
while(cin>>ch){//數據有多組,處理到文件結束!!!!!
int i = 0;
while( ch[i] != '\0' ){
if( !st.empty() && st.top() == ch[i] ){
if( ch[i] == 'O' ){//兩個大泡泡爆炸
st.pop();
}
else if( ch[i] == 'o' ){//兩個小泡泡合成大泡泡
st.pop();
if( !st.empty() && st.top() == 'O')//合成大泡泡要注意原來是否還有大泡泡
st.pop();
else
st.push('O');
}
}
else
st.push(ch[i]);
i++;
}
string ans = "";
while(!st.empty()){
ans += st.top();
st.pop();
}
for(int i = ans.length() - 1; i >= 0; i--)
printf("%c",ans[i]);
cout<<endl;
}
return 0;
}
可以用我這組數據測試一下
(雖然可能也沒什麼luan用)
輸入:
oOOoOoOOoooOoOooOo
輸出:
OoOo