吐泡泡算法题
GuanYiQiao这个题我是第二次才ac 第一遍没想到用栈来”瞻前” 因为是从左到右合嘛 第一遍的只过了百分之四十测试用例
第一次代码:(通过率40%)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#include <bits/stdc++.h> using namespace std;
string s;
int main() { while(cin>>s) { list<char> paopao; int Length=s.length(); for(int i=0;i<Length;i++) { paopao.push_back(s[i]); } list<char>::iterator p1; p1=paopao.begin(); while(p1!=paopao.end()) { if(*p1=='o') { p1++; if(p1==paopao.end()) continue; if(*p1=='o') { *p1='O'; list<char>::iterator p2; p2=p1; p1--; paopao.erase(p1); p1=p2; continue; } else if(*p1=='O') { continue; } } if(*p1=='O') { if(p1!=paopao.begin()) { p1--; if(*p1=='O') { list<char>::iterator p2; p2=p1; p1++; paopao.erase(p2); p2=p1; p1++; paopao.erase(p2); continue; } else if(*p1=='o') { p1++; p1++; if(p1==paopao.end()) continue; if(*p1=='O') { list<char>::iterator p2; p2=p1; p1--; paopao.erase(p1); p1=p2; p1++; paopao.erase(p2); continue; } else if(*p1=='o') { continue; } } } else{ p1++; if(p1==paopao.end()) continue; if(*p1=='O') { list<char>::iterator p2; p2=p1; p1--; paopao.erase(p1); p1=p2; p1++; paopao.erase(p2); continue; } else if(*p1=='o') { continue; } } } } for(list<char>::iterator i=paopao.begin();i!=paopao.end();i++) { cout<<*i; } }
cout<<endl;
return 0; }
|
其实可以把栈给利用起来
就是每遍历下一个泡泡 就遍历栈顶的元素 如果是小o就直接变成大O
因为是从左到右合并 所以左边的会自动与右边的合并 这个时候别着急把大O进栈 而是先看栈顶元素
那么此时情况分两种:
1,小o 直接把O进栈
2,大O 两个大O直接爆 直接出栈栈顶元素 目前遍历到的大O也作废了嘛 for循环遍历下一个泡泡
这样做可以满分通过:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| #include <bits/stdc++.h> using namespace std;
stack<char> st,tmp;
int main() { string s; while(cin>>s) { int len=s.length(); for(int i=0;i<len;i++) { char ch=s[i]; if(st.empty()) { st.push(ch); continue; } char top=st.top(); bool flag= false; while(top==ch) { if(ch=='o') { st.pop(); ch='O'; } else { st.pop(); flag=true; break; } if(st.empty()) break; top=st.top(); } if(!flag) { st.push(ch); } }
while(!st.empty()) { tmp.push(st.top()); st.pop(); } while(!tmp.empty()) { cout<<tmp.top(); tmp.pop(); } cout<<endl; } return 0; }
|
[视频内嵌代码]