励志用尽量少的代码做高效的表达。
题目(提交)链接→UVa-11988
题目大意:
输入一个字符串,输出在原本应该是怎么样的?
具体方法是:
若读取到‘[’, 则执行Home键:将光标移到行首。
若读取到’]’, 则执行End键:将光标移到行尾。
思路:
此题的本质是模拟鼠标光标处理线性序列。
基于这个核心思想,我们只需要定义一个类型做光标,若读到’[’,则该值移动到序列头部,
若读到‘]’,则该值移动到序列尾部。每正常读取一个字母,该值向后挪一位。
用什么来存储序列呢?本题为线性且需要大量的插入操作,故应用链表做存储单位, STL中封装好的链表容器为:list。 存储容器确定后,光标为list的迭代器。
注意:
11行代码中的it = l.insert(it,i),it++;
不能优化为:it = l.insert(it++,i);
。因为根据规定:除特殊情况,迭代器在一个表达式中不允许出现两种不同的值, 否则会造成紊乱。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
string s; while(cin >> s) {
list<char>l;
auto it = l.begin();
for(auto i : s) //遍历
if(i == '[') it = l.begin(); //若为[,光标移到头部
else if(i == ']') it = l.end(); //若为],光标移到尾部
else
it = l.insert(it,i),it++;
for(auto it : l) cout << it; //输出
cout << '\n';
}
return 0;
}
收获:
1、模拟光标类型题。
2、list容器处理大量插入删除序列。