zl程序教程

您现在的位置是:首页 >  其他

当前栏目

字符统计

2023-09-27 14:26:30 时间

题目描述

如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。

实现以下接口:
    输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
    按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
    清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。

 

 


输入描述:

输入一串字符。



输出描述:

对字符中的 各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。


输入例子:
aadddccddc

输出例子:
dca
思路:统计每个符合要求的字符的出现次数,然后按照题目要求调用sort()进行排序,自己编写符合要求的cmp函数,按序输出即可
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
bool cmp(const pair<char ,int> &a,const pair<char,int> &b)//题目要求出现次数一样则按ASCII由小到大输出,否则按照次数由大到小输出
    {
    if(a.second==b.second)return a.first<b.first;
    else return a.second>b.second;
}
bool ish(char s)
{//统计符合要求的字符
    if((s>='a'&&s<='z')||(s>='A'&&s<='Z')||(s>='0'&&s<='9')||(s==' '))return true;
    else return false;
}
int main()
    {
    string s;
    while(getline(cin,s))
        {
           int a[128]={0};//用于统计字符的出现次数
        vector<pair<char ,int>> v;
        for(int i=0;i<s.size();i++)
            {
            if(ish(s[i]))
               {
                  a[s[i]]++; 
               }   
        }
               for(int i=0;i<128;i++)//将出现次数不为0的字符加入vector中
               {
                   if(a[i]!=0)
                   {
                       v.push_back(make_pair(i,a[i]));
                   }
               }
               sort(v.begin(),v.end(),cmp);//按要求排序
         for(int i=0;i<v.size();i++)
               cout<<v[i].first;//按照次序输出
               cout<<endl;
    }  
    return 0;
}
下面是一种想法不错的实现(别人的)
#include <iostream>
#include <string>
#include<algorithm>
using namespace std;
bool ish(char s)
{
    if((s>='a'&&s<='z')||(s>='A'&&s<='Z')||(s>='0'&&s<='9')||(s==' '))return true;
    else return false;
}
int main()
{
    string st;
    while (getline(cin, st))
    {
        int a[128] = {0}, i, j, b[128] = {0};
        for (i = 0; i < st.length(); ++i)
        {
           if(ish(st[i]))
            {a[st[i]]++;
             b[st[i]]++;}
        }
        sort(a, a + 128);//将统计次数由小到大排序
        sort(st.begin(), st.end());//将字符由小到大排序
        for (i = 127; i >= 0; --i)//由出现次数多的先输出
        {
            if (a[i] == 0)break;
            for (j = 0; j < st.length(); ++j)//次数相等时,ASCII小的优先输出
            {
                if (b[st[j]] == a[i])
                {
                    cout << st[j];
                    b[st[j]] = 0;
                    break;
                }
            }
        }
        cout << endl;
    }
    return 0;
}