一开始不懂啊,什么Home键,什么End键,还以为相当于括号,[]里的东西先打印出来呢。后来果断百度了一下。 悲催啊。。。
题意:给定一个字符串,内部含有'['和']'光标转移指令,'['代表光标移向文章头,']'代表光标移向文章尾,问最终在屏幕上显示的字符串序列是什么
思路:直接模拟一下即可,不过因为由于会可能移动到字符串开头以及结尾,所以我开了3个char数组。
str1存储由于'['的原因而打印在开头的字符,str3存储由于']'的原因打印在结尾的字符,str2则是存储一开始在没遇到'['或']'之前的字符。
在A这道题的15个人里面,我写的竟然是最快的,82MS,就稍微沾沾自喜一下了哈。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <stack> using namespace std; stack<char> s; char str[100010]; char ans1[100010]; char ans2[100010]; char ans3[100010]; int main() { while(scanf("%s",str)!=EOF) { int len=strlen(str); //preidx表示ans1中最后索引所在的位置(它是从后往前移动的) //idx就是ans2中索引的位置 //aftidx是指ans3中索引的位置 int preidx=100000,idx=0,aftidx=0; for(int i=0; i<len; i++) { char ch=str[i]; if(ch=='[') { //l记录'['之后的第一个字符的位置 int l=++i; while(i<len && str[i]!='[' && str[i]!=']') { //ans=str.charAt(i)+ans; i++; } //最后i-1则是记录的是接下来遇到的'['或']'的前一个位置 for(int j=i-1; j>=l; j--) { ans1[preidx]=str[j]; preidx--; } i--; } else if(ch==']') { int l=++i; while(i<len && str[i]!='['&& str[i]!=']') { i++; } for(int j=l; j<i; j++) { ans3[aftidx]=str[j]; aftidx++; } i--; } else { ans2[idx]=str[i]; idx++; } } for(int i=preidx+1; i<=100000; i++) printf("%c",ans1[i]); for(int i=0; i<idx; i++) printf("%c",ans2[i]); for(int i=0; i<aftidx; i++) printf("%c",ans3[i]); printf(" "); } return 0; }