您的位置:首页 > 其它

字符统计——来自华为OJ平台测试基础篇

2014-09-29 18:28 483 查看

/*

* 描述: 如果统计的个数相同,则按照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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: