暑假集训单切赛第二场 UVA 11988 Broken Keyboard (a.k.a. Beiju Text)(字符串处理)

时间:2022-12-04 12:34:09

一开始不懂啊,什么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[]; char ans1[];
char ans2[];
char ans3[];
int main() {
while(scanf("%s",str)!=EOF) {
int len=strlen(str);
//preidx表示ans1中最后索引所在的位置(它是从后往前移动的)
//idx就是ans2中索引的位置
//aftidx是指ans3中索引的位置
int preidx=,idx=,aftidx=;
for(int i=; 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-; 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+; i<=; i++)
printf("%c",ans1[i]);
for(int i=; i<idx; i++)
printf("%c",ans2[i]);
for(int i=; i<aftidx; i++)
printf("%c",ans3[i]);
printf("\n");
}
return ;
}