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



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值