字符串解压缩

题目描述

将一段压缩后的字符串解压缩,并且排序输出。

解压规则:

每个字符串后面跟着一个数字,表示这个字符串的重复次数。例如,”a5”解压后的结果为”aaaaa”;’abc3’解压后的结果为”abcabcabc”。

排序规则:

1、根据每个字符串的重复次数升序排序,然后输出结果。例如,”a3b2”,输出的结果为”bbaaa”。

2、如果字符重复次数一样,则根据ASCII编码顺序做升序排序,然后输出结果。例如,”b2a2”,输出的结果为”aabb”。

输入描述:

输入的原始字符串仅包含字母与数字

输出描述:

输出的结果字符串仅包含字母

示例1

输入

a11b2bac3bad3abcd2

输出

abcdabcdbbbacbacbacbadbadbadaaaaaaaaaaa

注:原题给的示例输出结果有问题,abcd和b数量虽然都为2,但abcd的ASCII码小于b,所以先输出abcd。

————————————————

备注:机考用C没过,才刚刚写完,没来得及调试,好气噢,用C++相当简单。


#include <iostream>

#include <vector>

#include <string>

using namespace std;

int main()

{

    string strIn = "a11b2bac3bad3abcd2";


    /* 提取字符串 */

    vector<string> vStr;

    string strTmp;

    int chFlag = 0;

    for (int i = 0; i < strIn.size(); i++)

    {

        if (('a' <= strIn[i] && strIn[i] <= 'z') ||

          ('A' <= strIn[i] && strIn[i] <= 'Z'))

        {

            if (0 == chFlag)

            {

                chFlag = 1;

            }


            strTmp += strIn[i];

        }

        else

        {

            if (1 == chFlag)

            {

                vStr.push_back(strTmp);

                chFlag = 0;

                strTmp.clear();

            }

        }

    }


    /* 提取数字 */

    vector<int> vNum;

    int numFlag = 0;

    int numtmp = 0;

    for (int i = 0; i < strIn.size(); i ++)

    {

        if ('0' <= strIn[i] && strIn[i] <= '9')

        {

            if (0 == numFlag)

            {

                numFlag = 1;

            }


            numtmp = numtmp * 10 + strIn[i] - '0';

        }

        else

        {

            if (1 == numFlag)

            {

                vNum.push_back(numtmp);


                numtmp = 0;

                numFlag = 0;

            }

        }

    }


    /* 最后一个数字 */

    vNum.push_back(numtmp);


    //cout << "vStr: " << vStr.size() << endl;

    //cout << "vNum: " << vNum.size() << endl;


    /* 排序 */

    for (int i = 0; i < vNum.size(); i++)

    {

        int minnum = vNum[i];

        string minstmp = vStr[i];

        int minindex = i;


        for (int j = i; j < vNum.size(); j++)

        {

            if (vNum[minindex] > vNum[j])

            {

                minindex = j;

            }

            else if (vNum[minindex] == vNum[j] && vStr[minindex] > vStr[j])

            {

                minindex = j;

            }

        }


        vNum[i] = vNum[minindex];

        vStr[i] = vStr[minindex];

        vNum[minindex] = minnum;

        vStr[minindex] = minstmp;


        //cout << vStr[i] << ": " << vNum[i] << endl;

    }


    /* 输出字符串 */

    string strOut;

    string strOuttmp;

    for (int i = 0; i < vNum.size(); i++)

    {

        string strOuttmp = vStr[i];

        for (int j = 1; j < vNum[i]; j++)

        {

            strOuttmp += vStr[i];

        }


        strOut += strOuttmp;

    }


    cout << strOut << endl;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容