题目描述
将一段压缩后的字符串解压缩,并且排序输出。
解压规则:
每个字符串后面跟着一个数字,表示这个字符串的重复次数。例如,”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;
}