【PAT】【C++】1043. 输出PATest

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

输入格式

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

输出格式

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

输入样例

redlesPayBestPATTopTeePHPereatitAPPT

输出样例

PATestPATestPTetPTePePee

思路

  • 创建字母结点结构,结构包括字母和对应个数
  • vector容器存储6个字母结点,结点的字母分别是P,A,T,e,s,t
  • 遍历字符串,对每个字母个数进行计数
  • 输出字符串最开始为"PATest"
  • min为个数最少的字母的个数
  • 输出min个输出字符串
  • 输出字符串删去个数最少的字母
  • min为下一个个数最少的字母的个数
  • 循环
#include
#include
#include
using namespace std;

//创建字母结点结构,结构包括字母和对应个数
struct node
{
	char c;
	int cnt=0;
};

//比较函数,根据每个字母的个数降序排序
bool cmp(node a, node b)
{
	return a.cnt > b.cnt;
}

int main()
{
	string sin;
	cin >> sin;
	
	//vector容器存储6个字母结点,
	vector v(6);
	string sout = "PATest";

	//结点字母分别是P,A,T,e,s,t
	for (int i = 0; i < 6; i++)
	{	
		v[i].c = sout[i];
	}
	
	//遍历字符串,对每个字母个数进行计数
	for (int i = 0; i < sin.length(); i++)
	{
		if (sin[i] == 'P')
			v[0].cnt++;
		else if (sin[i] == 'A')
			v[1].cnt++;
		else if (sin[i] == 'T')
			v[2].cnt++;
		else if (sin[i] == 'e')
			v[3].cnt++;
		else if (sin[i] == 's')
			v[4].cnt++;
		else if (sin[i] == 't')
			v[5].cnt++;
	}
	
	//按字母个数将容器元素进行降序排序
	sort(v.begin(), v.end(), cmp);
	
	int min = 0; //用来记录个数最少字母的个数
	vector::iterator it = v.end(); //迭代器最开始指向容器末尾
	for (int i = 0; i < 6; i++)
	{
		//从容器最后一个元素开始遍历得到min值
		it--;
		min = it->cnt; 
		//每次输出min个输出字符串
		for (int j = 0; j < min; j++)
		{
			cout << sout;
		}
	
		//将个数最少的字母从输出字符串删除
		sout.erase(sout.find(it->c), 1);
		
		//其他字母的个数减去min,然后继续循环遍历
		for (int j = 0; j < 5-i; j++)
		{
			v[j].cnt -= min;
		}
	}

	return 0;
}

柳神的方法: 特别简便

#include
using namespace std;

int main()
{
	int map[128] = { 0 };
	int c;

	//c为输入的一个字符的ASCII码,利用字符和ASCII码可以相互转换
	while ((c = cin.get()) != EOF)
		map[c]++; //记录下每个字符的个数

	while (map['P'] > 0 || map['A'] > 0 || map['T'] > 0 || map['e'] > 0 || map['s'] > 0 || map['t'] > 0)
	{
		if (map['P']-- > 0)
			cout << 'P';
		if (map['A']-- > 0)
			cout << 'A';
		if (map['T']-- > 0)
			cout << 'T';
		if (map['e']-- > 0)
			cout << 'e';
		if (map['s']-- > 0)
			cout << 's';
		if (map['t']-- > 0)
			cout << 't';
	}

	return 0;
}

你可能感兴趣的:(PAT,C++)