字符统计及重排
字符统计及重排
【字符统计及重排】给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及
其出现次数。如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
其出现次数。如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
输入描述:
输入一行,为一个仅包含字母的字符串。
输出描述:
按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾的分号;字母和次数间用英文冒号分隔。
示例1
输入
xyxyXX
输出
x:2;y:2;X:2;
C++
#include<bits/stdc++.h> #include<unordered_map> using namespace std; /* 【字符统计及重排】给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及 其出现次数。如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。 输入描述: 输入一行,为一个仅包含字母的字符串。 输出描述: 按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾的分号;字母和次数间用英文冒号分隔。 示例1: 输入 xyxyXX 输出 x:2;y:2;X:2; */ bool cmp(vector<int> num1, vector<int>num2); int main() { vector<char>input; char n; n = getchar(); while(n != '\n') { //if(n == '\n') //{ // break; //} input.push_back(n); n = getchar(); } vector<vector<int>>num; map<char,int>m; //先用map存,再转为vector排序; for (int i = 0; i < input.size(); i++) { m[input[i]]++; } map<char, int>::iterator it; it = m.begin(); while(it != m.end()) { num.push_back({ it->first, it->second }); it++; } sort(num.begin(), num.end(), cmp); for (int i = 0; i < num.size(); i++) { if(i != num.size() - 1) { cout << (char)num[i][0] << ":" << num[i][1] << ";"; }else { cout << (char)num[i][0] << ":" << num[i][1]; } } cout << endl; system("pause"); return 0; } bool cmp(vector<int> num1,vector<int>num2) { if(num1[1] == num2[1]) { if((char)num1[0] <= 'Z' && (char)num2[0] <='Z') { return (char)num1[0] < (char)num2[0]; }else if((char)num1[0] <= 'Z' || (char)num2[0] <= 'Z') { return(char)num1[0] > (char)num2[0]; }else { return (char)num1[0] < (char)num2[0]; } }else { return (char)num1[1] > (char)num2[1]; } }