16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告

励志用尽量少的代码做高效的表达。


题目(提交)链接→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容器处理大量插入删除序列。


择苦而安,择做而乐。虚拟现实终究比不过真实精彩之万一。

发布了97 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104838475
今日推荐