UVA11988 破损的键盘 Broken Keyboard (a.k.a. Beiju Text)

题意翻译

你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下。你却不知道此问题,而是专心致志地打稿子,甚至显示器都没开。当你打开显示器之后,展现你面前的数一段悲剧文本。你的任务是在显示器打开前计算出这段悲剧的文本。 给你一段按键的文本,其中’[‘表示Home键,’]'表示End键,输入结束标志是文件结束符(EOF)。
输入

This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University

输出

BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

思路1:由于home 和end键,所以会涉及到字符的插入,如果使用数组,那么插入元素会涉及到数组元素的移动,时间复杂度是很大的。经常插入,我们想到了链表这一数据结构.通过判断home键/end键我们改变迭代器的位置,然后进行后序字符的插入。记得insert函数使用后会返回插入的字符的迭代器(指向该字符),然后插入下一个字符之前记得更新迭代器的位置,不然就会出错我就在这里错了好久

参考代码1
#include<bits/stdc++.h>
using namespace std;
string str;
list<char> L;

void solve(string &s){
	L.clear();
	list<char>::iterator it = L.begin();	
	for(int i = 0; i < s.size();i++){
		if(s[i]=='['){
			it = L.begin();
		}else if(s[i]==']'){
			it = L.end();
		}else{
			it= L.insert(it,s[i]);//在it后面插入一个字符 
			it++;
		}
	}
	for(list<char>::iterator it1 = L.begin(); it1 != L.end(); it1++){
		cout<<*it1;
	} 
	cout<<endl;
}
int main()
{
	while(cin>>str){
		solve(str);
	}
	return 0;
}

思路2:由于字符串具有拼接简便的特性,所以可以利用字符串来搞。对于每个字符串s,遍历每个字符,然后判断,如果是home键,就把之后的字符放到一个临时字符串s2中,然后当下一次遇到end键之时进行更新主串s3 = s2+s3; 最后一步也要需要处理.

参考代码
#include<bits/stdc++.h>
using namespace std;
string s;
void solve(string &s){
	string s2  = "",s3 = "";//s2:用于暂存头部操作的字符串   s3 :主字符串 
	int flag = 0;//用于标记在头部操作还是尾部 
	for(int i = 0; i < s.length(); i++){
		if(s[i]=='['){
			flag = 1;//标记光标最前面 
		}else if(s[i]==']'){
			s3 = s2+s3;
			s2 = "";
			flag = 0;//最后面 
		}else{
			if(flag){
				s2 += s[i];
			} else{
				s3 += s[i];
			}
		}
	}
	s3 = s2+s3; 
	cout<<s3<<endl;
}
int main()
{
	while(cin>>s){
		solve(s);
	}
	return 0;
}

注意:思路二存在一定的漏洞,可能某些细节没处理好,样例通过了但不能AC.希望能够看出问题的小伙伴留言,交流下.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的大李子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值