一、题目
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按“PATestPATest....”这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按PATest的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
redlesPayBestPATTopTeePHPereatitAPPT
输出样例:
PATestPATestPTetPTePePee
二、思路
这是一道以字符串为对象的题目,很经典,这里涉及到一种记录字母顺序方式的方法,将特定对象使用包装数据结构dict组织起来,然后进行操作运算,具体实现思路如下:
步骤一:题目要求按PATest得顺序打印输出,首先开一个hashtable数组用来记录其中六个字符串分别出现的次数。同时可用一个sum变量来记录总个数,通过这种记录方法,读取完字符串之后就可以直接统计出这个数组,其次,为了不重复写判断‘P’,‘A’..等,可以将这个特定对象用char型dict包装起来,形成写法统一。这样就可以直接写成str[i]==dict[j],完成循环。
步骤二:遍历hashtable数组,
三、实现
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int max = 10010;
int sum = 0; //记录字符串总个数
int hashtable[6];
char dict[6] = {'P','A','T','e','s','t'};
int main()
{
char str[max];
cin >> str;
//暴搜并进行标记
int len = strlen(str);
for (int i = 0; i < len; i++)
for (int j = 0; j < 6; j++)
{
if (str[i] == dict[j])hashtable[j]++;
sum++;
}
//顺序输出
while (sum > 0)
{
for (int i = 0; i < 6; i++)
{
if (hashtable[i] > 0) {
cout << dict[i];
hashtable[i]--;
sum--;
}
}
}
system("pause");
return 0;
}
当sum变量记录的是每组PATest时,则程序可以写成这样
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int max = 10010;
int sum = 0;
int hashtable[6];
char dict[6] = {'P','A','T','e','s','t'};
int main()
{
char str[max];
cin >> str;
//暴搜并进行标记
int len = strlen(str);
for (int i = 0; i < len; i++)
for (int j = 0; j < 6; j++)
{
if (str[i] == dict[j])hashtable[j]++;
if(j==5)sum++;
}
//顺序输出
while (sum > 0)
{
for (int i = 0; i < 6; i++)
{
if (hashtable[i] > 0) {
cout << dict[i];
hashtable[i]--;
}
}
sum--;
}
system("pause");
return 0;
}