题目描述:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计。按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出。
输入描述:输入一串字符。
输出描述:对字符中的各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
示例
输入:././aadddcc d dc2././
输出:dc a2
先导知识:
1.ascll 码和 char 字符相互转换
转换方法:直接进行强制类型装换
#include <iostream>
using namespace std;
int main()
{
int i = 97; //十进制 97 ascll码对应 char 字符为 ‘a’
cout << (char)i << endl;
char j = 'a';
cout << (int)j << endl;
}
/*=======================================
函数输出:a
97
=======================================*/
2.map 容器中的内容不按 key 排序而按 value 排序
排序方法:将 map 的 key 值和 value 值分别放在 pair 类型的 vector 中,构造比较函数Compare
bool Compare(const pair<char, int> &p1, const pair<char, int> &p2)
{ return p1.second > p2.second; }
对于已经写好的 map<char, int> 类型的容器mymap,则具体实现按 value 值排序的过程为:
vector<pair<char, int>> myvector;
for(map<char, int>::iterator it = mymap.begin(); it != mymap.end(); it++)
myvector.push_back(make_pair(it->first, it->second);
3.pair 和 make_pair 区别
(1)std::pair:
template <class T1,class T2> struct pair;
这个类将一对值组合在一起,这些值可能是不同类型的(T1 和 T2)。可以通过其公共成员访问各个值first 和 second。
pair 是将2个数据组合成一个数据,当需要这样的需求时就可以使用 pair,如stl中的map就是将key和value放在一起来保存。 另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。
(2)std::make_pair:
template <class T1, class T2>
pair<T1, T2> make_pair (T1 x, T2 y)
{
return ( pair<T1,T2>(x, y) );
}
构造一个 pair 对象,其第一个元素设置为x,第二个元素设置为y。模板类型可以从传递给的参数中隐式推导出来。
#include <utility> // std::pair
#include <iostream> // std::cout
int main () {
std::pair <int,int> foo;
std::pair <int,int> bar;
foo = std::make_pair (10,20);
bar = std::make_pair (10.5,'A'); // ok: implicit conversion from pair<double,char>
std::cout << "foo: " << foo.first << ", " << foo.second << '\n';
std::cout << "bar: " << bar.first << ", " << bar.second << '\n';
return 0;
}
/*================
foo:10,20
bar:10,65
================*/
对于 make_pair 来说无需写出参数类别, 就可以生成一个 pair 对象 。比如std::make_pair (10,20);而不必费力写成: std::pair <int,int>(10,20) ;
当有必要对一个接受pair参数的函数传递两个值时, make_pair()尤其显得方便,
vector<pair<char, int>> myvector;
for(int i = 0; i < 128; i++)
if(a[i] != 0)
myvector.push_back(make_pair((char)i, a[i]));
4.计数法排序
请看博主的另一篇文章: https://blog.youkuaiyun.com/qq_41291253/article/details/90293423
5.stable_sort排序
请看博主另一篇文章:https://blog.youkuaiyun.com/qq_41291253/article/details/89920321
1.解题思路
- 先统计英文字符、数字、空格的数量
- 将统计好的数据按数量大小进行降序排序
- 输出排序后对应的字母、数字或空格
2.参考代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
//return max value
bool cmp(const pair<char, int>&p1, const pair<char, int>&p2)
{ return p1.second > p2.second; }
int main()
{
string str;
while(getline(cin, str))
{
//Count the number of occurrences of characters
int a[128] = {0};
for(int i = 0; i < str.size(); i++)
if(str[i] == ' ' || (str[i] >= '0' && str[i] <= '9') ||
(str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))
a[str[i]]++;
//Press non-zero characters into vector in ascll code order
vector<pair<char, int>> myvector;
for(int i = 0; i < 128; i++)
if(a[i] != 0)
myvector.push_back(make_pair((char)i, a[i]));
//Sorts the elements in the range [first,last) into ascending order, like sort,
//but stable_sort preserves the relative order of the elements with equivalent values.
stable_sort(myvector.begin(), myvector.end(), cmp);
for(vector<pair<char, int>>::iterator it = myvector.begin(); it != myvector.end(); it++)
cout << it->first;
cout << endl;
}
}
/*===============================================
函数输出:././aadddcc d dc2././
dc a2
cz01czdjf234./sdfz
zcdf01234js
===============================================*/