PAT B 1043(乙级)

1043 输出PATest(20 分)

作者: CHEN, Yue

单位: 浙江大学

时间限制: 400ms

内存限制: 64MB

代码长度限制: 16KB

给定一个长度不超过 10​4​​ 的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 PATest 的顺序打印,直到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过 10​4​​ 的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:

redlesPayBestPATTopTeePHPereatitAPPT

输出样例:

PATestPATestPTetPTePePee

 


 

题目中没有说是否区分输入字符的大小写,但是根据题意应该是会区分大小写的,如果不放心可以数一下样例中的大小写T输入输出是否相同。

这道题我们同样可以使用一个大小为6的数组分别统计这6个字母的个数,然后循环输出,如果不够就不输出,直到所有的字母剩余个数都为0。

 

可以使用另一个char型数组来存储6个字母与下标的对应关系,这样寻找根据字母寻找对应下标或者根据下标寻找对应字母都会方便很多。

《算法笔记》中检测所有字母个数都为0的方法是使用一个int型变量保存了字母的总个数,当总个数为0时就停止输出,我的代码中使用了较为笨的方法直接手动对6个字母的个数进行检查。

 

此题总体来说属于简单题。

 


 

AC代码:

#include <cstdio>
#include <ctype.h>

int main() {
    int num[6] = {0};
    char st[10010];
    char m[6] = {'P', 'A', 'T', 'e', 's', 't'};

    scanf("%s", st);
    for(int i = 0; st[i] != '\0'; ++i) {
        switch(st[i]) {
            case 'P':
                ++num[0];
                break;
            case 'A':
                ++num[1];
                break;
            case 'T':
                ++num[2];
                break;
            case 'e':
                ++num[3];
                break;
            case 's':
                ++num[4];
                break;
            case 't':
                ++num[5];
                break;
            default:
                break;
        }
    }

    while(num[0] != 0 || num[1] != 0 || num[2] != 0
          || num[3] != 0 || num[4] != 0 || num[5] != 0) {
        for(int i = 0; i < 6; ++i) {
            if(num[i] > 0) {
                --num[i];
                printf("%c", m[i]);
            }
        }
    }

    return 0;
}

 


 

如有错误,欢迎指摘。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值