美文网首页
2019-03-07-浙大PTA-basic-043

2019-03-07-浙大PTA-basic-043

作者: 简_chen | 来源:发表于2019-03-07 19:08 被阅读0次

    浙大PTA-basic-043

    1原题以及我的做法

    思路:蛮力算法,

    从头开始找,找到P,输出,并且替换为space;

    在从头开始找,找到A...

    ...

    每轮按序找六个字母一遍,找到并修改了一个字母,就设置change为1,

    若修改了6个,就changeCount为6,

    当changeCount==0时,说明所有PATest均已经被输出,就退出

    /*
    1043 输出PATest (20 分)
    给定一个长度不超过 10^4的、仅由英文字母构成的字符串。
    请将字符重新调整顺序,按 PATestPATest.... 
    这样的顺序输出,并忽略其它字符。
    当然,六种字符的个数不一定是一样多的,
    若某种字符已经输出完,则余下的字符仍按 PATest 的顺序打印,
    直到所有字符都被输出。
    
    输入格式:
    输入在一行中给出一个长度不超过 10^4的、
    仅由英文字母构成的非空字符串。
    
    输出格式:
    在一行中按题目要求输出排序后的字符串。题目保证输出非空。
    
    输入样例:
    redlesPayBestPATTopTeePHPereatitAPPT
    输出样例:
    PATestPATestPTetPTePePee
    */
    #include<iostream>
    #include<string.h>
    using namespace std;
    
    //如果该字母未被找到,change=0
    //找到了,change=1
    int printAndReplace(char* str,char ch) {
        int change = 0;
        for (int i = 0; i < strlen(str); i++) {
            if (str[i] == ch) {
                cout << ch;
                str[i] = ' ';
                break;
                change = 1;
            }
        }
        return change;
    }
    
    int main()
    {
        char str[10000] ;
        cin >> str;
        char pta[] = "PATest";
        
        while (true) {
            int changeCount = 0;
            for (int i = 0; i < 6; i++) {
                changeCount += printAndReplace(str, pta[i]);
            }
            if (changeCount = 0)
                break;
        }
        system("pause");
        return 0;
    }
    
    

    2结果和分析

    • ==结果:超时==;

      优点:直观简洁

      缺点:时间复杂度本来可以O(n),被我搞成了O(n^2)

    • 分析:做了很多无用功,按照10000个字符为例,字符是PATest重复1600次,

      那么,我需要扫描这个字符串1600次,但是实际上多少次就可以了呢?

      6次就可以,分别将PATest各扫描一次,统计出各个字母的数量,再做输出就可以了

    • ==终极版本:一次扫描,事实上只需要一次扫描,就足以统计出六个字母的数量==

    3新版本的代码

    
    #include<iostream>
    #include<string.h>
    using namespace std;
    
    int main() {
        char str[10000];
        cin >> str;
    
        int P = 0, A = 0, T = 0, e = 0, s = 0, t = 0;//存储 六个字符出现次数
    
        for (int i = 0; i < strlen(str); i++) {     //统计 六个字符出现次数
            switch (str[i]) {
            case 'P':
                P++;
                break;
            case 'A':
                A++;
                break;
            case 'T':
                T++;
                break;
            case 'e':
                e++;
                break;
            case 's':
                s++;
                break;
            case 't':
                t++;
                break;
            }
        }
    
        //输出六个字符
        while (P != 0 || A != 0 || T != 0 || e != 0 || s != 0 || t != 0) {
            if (P != 0) {
                P--;
                cout << 'P';
            }
            if (A != 0) {
                A--;
                cout << 'A';
            }
            if (T != 0) {
                T--;
                cout << 'T';
            }
            if (e != 0) {
                e--;
                cout << 'e';
            }
            if (s != 0) {
                s--;
                cout << 's';
            }
            if (t != 0) {
                t--;
                cout << 't';
            }
        }
        //system("pause");
    }
    

    相关文章

      网友评论

          本文标题:2019-03-07-浙大PTA-basic-043

          本文链接:https://www.haomeiwen.com/subject/krmhpqtx.html