输入一个字符串,对字符中的各个英文字符,数字,空格进行统计。 按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出

该博客介绍了如何统计一个字符串中英文字符、数字和空格的出现次数,按照出现次数降序排列,如果次数相同则根据ASCII码升序排序。涉及到的知识点包括ASCII码和字符转换、map按value排序、pair和make_pair的使用以及计数法排序和stable_sort排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

输入一个字符串,对字符中的各个英文字符,数字,空格进行统计。按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出。

输入描述:输入一串字符。


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

示例
输入:././aadddcc d dc2././
输出:dc a2


先导知识:

1.ascll 码和 char 字符相互转换

转换方法:直接进行强制类型装换

#include <iostream>
using namespace std;

int main()
{
    int i = 97;                //十进制 97 ascll码对应 char 字符为 ‘a’
    cout << (char)i << endl;
    char j = 'a';
    cout << (int)j << endl;
}
/*=======================================
 函数输出:a
         97
 =======================================*/

2.map 容器中的内容不按 key 排序而按 value 排序

排序方法:将 map 的 key 值和 value 值分别放在 pair 类型的 vector 中,构造比较函数Compare

bool Compare(const pair<char, int> &p1, const pair<char, int> &p2) 
{    return p1.second > p2.second;    }

对于已经写好的 map<char,  int> 类型的容器mymap,则具体实现按 value 值排序的过程为:

vector<pair<char, int>> myvector;
for(map<char, int>::iterator it = mymap.begin(); it != mymap.end(); it++)
    myvector.push_back(make_pair(it->first, it->second);

3.pair 和 make_pair 区别

(1)std::pair:

template <class T1,class T2> struct pair;

这个类将一对值组合在一起,这些值可能是不同类型的(T1 和 T2)。可以通过其公共成员访问各个值first 和 second。

pair 是将2个数据组合成一个数据,当需要这样的需求时就可以使用 pair,如stl中的map就是将key和value放在一起来保存。 另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。

(2)std::make_pair:

template <class T1, class T2>
  pair<T1, T2> make_pair (T1 x, T2 y)
{
    return ( pair<T1,T2>(x, y) );
}

构造一个 pair 对象,其第一个元素设置为x,第二个元素设置为y。模板类型可以从传递给的参数中隐式推导出来。

#include <utility>      // std::pair
#include <iostream>     // std::cout

int main () {
  std::pair <int,int> foo;
  std::pair <int,int> bar;

  foo = std::make_pair (10,20);
  bar = std::make_pair (10.5,'A'); // ok: implicit conversion from pair<double,char>

  std::cout << "foo: " << foo.first << ", " << foo.second << '\n';
  std::cout << "bar: " << bar.first << ", " << bar.second << '\n';

  return 0;
}
/*================
foo:10,20 
bar:10,65
================*/

对于 make_pair 来说无需写出参数类别, 就可以生成一个 pair 对象 。比如std::make_pair (10,20);而不必费力写成: std::pair <int,int>(10,20) ;

当有必要对一个接受pair参数的函数传递两个值时, make_pair()尤其显得方便,

vector<pair<char, int>> myvector;
        for(int i = 0; i < 128; i++)
            if(a[i] != 0)
                myvector.push_back(make_pair((char)i, a[i]));

4.计数法排序

请看博主的另一篇文章: https://blog.youkuaiyun.com/qq_41291253/article/details/90293423

5.stable_sort排序

请看博主另一篇文章:https://blog.youkuaiyun.com/qq_41291253/article/details/89920321


1.解题思路

  • 先统计英文字符、数字、空格的数量
  • 将统计好的数据按数量大小进行降序排序
  • 输出排序后对应的字母、数字或空格

2.参考代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

//return max value
bool cmp(const pair<char, int>&p1, const pair<char, int>&p2)
{   return p1.second > p2.second;   }

int main()
{
    string str;
    while(getline(cin, str))
    {
        //Count the number of occurrences of characters
        int a[128] = {0};
        for(int i = 0; i < str.size(); i++)
            if(str[i] == ' ' || (str[i] >= '0' && str[i] <= '9') ||
               (str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))
                a[str[i]]++;
        
        //Press non-zero characters into vector in ascll code order
        vector<pair<char, int>> myvector;
        for(int i = 0; i < 128; i++)
            if(a[i] != 0)
                myvector.push_back(make_pair((char)i, a[i]));     
        
        //Sorts the elements in the range [first,last) into ascending order, like sort,
        //but stable_sort preserves the relative order of the elements with equivalent values.
        stable_sort(myvector.begin(), myvector.end(), cmp);
        
        for(vector<pair<char, int>>::iterator it = myvector.begin(); it != myvector.end(); it++)
            cout << it->first;
        cout << endl;
    }
}

/*===============================================
 函数输出:././aadddcc d dc2././
        dc a2
        cz01czdjf234./sdfz
        zcdf01234js
===============================================*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值