题目链接
Problem Description
读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出。
Input
题目包含多组用例,每组用例占一行,包含ZOJ三个字符,当输入“E”时表示输入结束。
1<=length<=100。
Output
对于每组输入,请输出一行,表示按照要求处理后的字符串。
具体可见样例。
Sample Input
ZZOOOJJJ
ZZZZOOOOOJJJ
ZOOOJJ
E
Sample Output
ZOJZOJOJ
ZOJZOJZOJZOO
ZOJOJO
//基本思路:分成3个数组
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[105];
memset(s,0,sizeof(s));
while(cin>>s){
if(*s=='E')
break;
char sz[105],so[105],sj[105];
int iz = 0, io = 0, ij = 0;
memset(sz,0,sizeof(sz));
memset(so,0,sizeof(so));
memset(sj,0,sizeof(sj));
int length = strlen(s);
for(int i = 0;i<length;i++){
if(s[i]=='Z')
sz[iz++] = 'Z';
else if(s[i]=='O')
so[io++] = 'O';
else
sj[ij++] = 'J';
}
int x = 0, y = 0, z = 0;
while(x<iz||y<io||z<ij){
for(;x<iz;){//x++不能放在for里面
cout<<'Z';
x++;
break;
}
for(;y<io;){//同理
cout<<'O';
y++;
break;
}
for(;z<ij;){
cout<<'J';
z++;
break;
}
}
cout<<endl;
}
return 0;
}
第二种方法:将空间作为代价,换取时间
//基本思路:将ASCII码值作为下标
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[105];
int num[128];
memset(s,0,sizeof(s));
fill(num,num+128,0);//初始化
while(cin>>s){
if(*s=='E')
break;
int length = strlen(s);
for(int i = 0;i<length;i++)
num[s[i]-'A']++;
while(length--){
//三者之间是并列的关系不能使用if-else if-else结构
if(num['Z'-'A']>0){
cout<<'Z';
num['Z'-'A']--;
}
if(num['O'-'A']>0){
cout<<'O';
num['O'-'A']--;
}
if(num['J'-'A']>0){
cout<<'J';
num['J'-'A']--;
}
}
cout<<endl;
}
return 0;
}
第三种方法:简单粗暴(第一种方法的改进版本)
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[105];
memset(s,0,sizeof(s));
while(cin>>s){
if(*s=='E')
break;
int length = strlen(s);
int iz = 0, io = 0, ij = 0;
for(int i = 0;i<length;i++){
if(s[i]=='Z')
iz++;
else if(s[i]=='O')
io++;
else
ij++;
}
while(iz>0||io>0||ij>0){
if(iz>0){
cout<<'Z';
iz--;
}
if(io>0){
cout<<'O';
io--;
}
if(ij>0){
cout<<'J';
ij--;
}
}
cout<<endl;
}
return 0;
}