题目描述:
如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证: 输入的字符串以‘\0’结尾。
知识点: 字符串,排序
输入: 一串字符
输出: 对字符中的各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
样例输入: aadddccddc
样例输出: dca
思路:
如果事先指定计算字符频率的大小,这样会浪费空间,而且不利于排序。
于是想到今天早上刚学习的C++ 模板类vetor动态创建数组。
而且为了在排序后还能立刻知道对应的字符,于是想到了是用结构体。
代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct Node{
int num = 0;
char ch;
};
vector <Node> temp;
int main()
{
string str;
getline(cin, str);
int len = str.size(),i,j,flag=0,n=0;
for (i = 0; i < len; i++)
{
if (str[i] == ' ' || isdigit(str[i]) || isalpha(str[i]))
{
for (j = 0; j < n; j++)
{
if (str[i] == temp[j].ch)
{
temp[j].num++;
flag = 1;
break;
}
}
if (flag == 0)
{
Node m;
n++;
m.num = 1;
m.ch = str[i];
temp.push_back(m);
}
else
flag = 0;
}
}
int size = temp.size();
Node tmp;
for (i = 0; i < size-1; i++)
{
for (j = i + 1; j < size; j++)
{
if (temp[i].num < temp[j].num)
{
tmp = temp[i];
temp[i] = temp[j];
temp[j] = tmp;
}
else if (temp[i].num == temp[j].num)
{
if (temp[i].ch > temp[j].ch)
{
tmp = temp[i];
temp[i] = temp[j];
temp[j] = tmp;
}
}
}
}
for (i = 0; i < size; i++)
cout << temp[i].ch;
cout << endl;
// system("pause");
return 0;
}
得分 | 运行时间 | 内存 | 复杂度 | 最大嵌套深度 |
100(100) | 15ms | 2036KB | 15 | 5 |