/*
* 描述: 如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
* 实现以下接口:
* 输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
* 按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
* 清空目前的统计结果,重新统计
* 调用者会保证:
* 输入的字符串以‘\0’结尾。
* 知识点: 字符串,排序
* 题目来源: 内部整理
* 练习阶段: 初级
* 运行时间限制: 10Sec
* 内存限制: 128MByte
* 输入:
* 输入一串字符。
* 输出:
* 对字符中的各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。
* 如果有其他字符,则对这些字符不用进行统计。
* 样例输入: aadddccddc
* 样例输出: dca
* 完成日期:2014/09/29
*/
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
void Input(std::string &str,int &strlen);
void CharStatistics(map<char,int> &Statistics,std::string str,int strlen);
void Sort(map<char,int> Statistics,map<int,vector<char>> &sort);
void Output(map<int,vector<char>> sort);
typedef struct
{
char c;
int num;
}Pairs;
int main()
{
std::string str;
int strlen;
map<char,int> Statistics;
map<int,vector<char>> sort;
Input(str,strlen);
CharStatistics(Statistics,str,strlen);
Sort(Statistics,sort);
Output(sort);
system("pause");
return 0;
}
/*
* 输入字符串
*/
void Input(std::string &str,int &strlen)
{
getline(std::cin,str,'\n');
strlen = str.size();
return;
}
/*
* 给每个字符计数
*/
void CharStatistics(map<char,int> &Statistics,std::string str,int strlen)
{
char c;
for(int i=0;i<strlen;i++)
{
c = str.at(i);
if( (!(c>=48 && c<=57)) /* 0到9*/
&& (!(c>=65 && c<=90)) /* A到Z */
&& (!(c>=97 && c<=122)) /* a到z */
&& c!=32) /* 空格 */
{
break;
}
++Statistics[c];
}
return;
}
/*
* 以字符统计的个数为关键字(升序排列),统计个数相同的字符,并按ASCII码值进行升序排列
*/
void Sort(map<char,int> Statistics,map<int,vector<char>> &sort)
{
map<char,int>::iterator iter;
typedef map<int,vector<char>> charsort;
charsort m_charsort;
int size = sort.size();
vector<char> v;
char c;
for(iter=Statistics.begin();iter!=Statistics.end();iter++)
{
int keyint = iter->second;
map<int,vector<char>>::iterator m_iter = m_charsort.find(keyint);
if(m_iter!=m_charsort.end()) /* key值存在,则往vector中添加新字符 */
{
(m_iter->second).push_back(iter->first);
}
else /* key值不存在,则添加新元素 */
{
vector<char> v;
v.push_back(iter->first);
m_charsort.insert(charsort::value_type(iter->second,v));
}
}
sort = m_charsort;
for(int i=size-1;i>=0;i--)
{
v = sort[i];
int num = v.size();
for(int j=num;j>0;j--)
{
for(int i=0;i<num;i++)
{
if(v.at(i)<v.at(i+1))
{
c = v.at(i);
v.at(i) = v.at(i+1);
v.at(i+1) = c;
}
}
}
}
return;
}
/*
* 逆序输出,即按照统计个数由多到少输出
*/
void Output(map<int,vector<char>> sort)
{
map<int,vector<char>>::reverse_iterator i;
vector<char> v;
for(i=sort.rbegin();i!=sort.rend();++i)
{
v = i->second;
int num = v.size();
for(int j=0;j<num;j++)
{
std::cout << v[j];
}
}
std::cout << endl;
return;
}