ZOJ

来源:互联网 发布:淘宝人气值是什么 编辑:程序博客网 时间:2024/06/03 18:37

题目链接
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;}
原创粉丝点击