输入一串数字序列,对其进行一系列操作:1. 反转操作;2. 删除序列第一个元素。输入格式如下:[1,2,3,4]
考虑对输入的处理,字符char 类型和int 类型交替出现,可以输入一个字符,紧接着输入一个整数,再输入一个字符。。。。在Dev-C++中测试一下,没有空格分开的情况下,两位的整数也能正确读入。char ch;
int temp;
cin>>ch>>temp;
cout<<ch<<" "<<temp<<endl;
考虑反转操作需要花费比较多时间,可以设置一个布尔变量flag 标记序列是否被反转,每次反转只要对布尔值取反就可以了。
以为这道题就这么水过去了,谁知一直WA。。。无奈之下求助搜索工具,找到一个blog 说两位数的输入要特殊处理,当作字符串输入,再提取出数字。如此看来sicily 的环境和Dev-C++是不一样的,真是不能偷懒做些那么不可靠的尝试的。。
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <list>
#include <queue>
#include <algorithm>
using namespace std;
string op,buf;
int n;
int lis[100009];
int main(){
int t;
cin>>t;
while(t--){
cin>>op>>n>>buf;
int bufLen=buf.length();
int count=0;
int temp=0;
for(int i=1;i<bufLen;++i){
if(buf[i]>='0' && buf[i]<='9'){
temp*=10;
temp+=buf[i]-'0';
}
else {
lis[count++]=temp;
temp=0;
}
}
//for(int i=0;i<count;++i) cout<<lis[i]<<" ";
//cout<<endl;
bool flag=false,error=false;
int start=0,end=n;
int len=op.length();
for(int i=0;i<len;++i){
if(op[i]=='R') flag=!flag;
else if(op[i]=='D'){
if(start==end) {
error=true;
break;
}
if(flag) end--;
else start++;
}
}
if(error){
printf("error\n");
continue;
}
if(start==end) printf("[]\n");
else if(flag){
cout<<"[";
for(int i=end-1;i>start;--i) cout<<lis[i]<<",";
cout<<lis[start]<<"]\n";
}
else {
cout<<"[" ;
for(int i=start;i<end-1;++i) cout<<lis[i]<<",";
cout<<lis[end-1]<<"]\n";
}
}
}