【华为od刷题(C++)】HJ23 删除字符串中出现次数最少的字符

发布于:2025-07-04 ⋅ 阅读:(19) ⋅ 点赞:(0)

我的代码:

#include <iostream>//用于输入输出操作
#include <unordered_map>
//引入哈希表容器unordered_map,用来存储每个字符出现的次数
using namespace std;

int main() {
    string str;//声明一个字符串变量str,用于接收输入的字符串
    int min = 27;//声明一个整型变量min,初始值设为27
    unordered_map<char, int> mp;//声明一个unordered_map
    //它的键是字符(char类型),值是整数(表示字符出现的次数)

    //先计算字符串中各个字符的出现个数
    while (cin >> str) {//通过cin >> str读取输入的字符串,每次读取一个字符串

        for (char c : str) {//遍历字符串中的每个字符
            ++mp[c - 'a'];//用于更新哈希表mp中每个字符的出现次数
            //(字符'c'转换为0到25之间的整数,通过c - 'a')

            //c 是当前字符串中的一个字符,'a' 是字符 'a' 的 ASCII 值
            //c - 'a' 计算的是字符 c 距离字符 'a' 的偏移量
            
            //mp[c - 'a'] 用于访问哈希表 mp 中对应的键值对
            //键是 c - 'a',它是从 0 到 25 之间的整数,
            //表示字母 'a' 到 'z' 的位置
            //mp[c - 'a'] 对应的是字符 c 出现的次数

            //如果字符 c 第一次出现,
            //mp[c - 'a'] 会被自动初始化为 0(默认值),然后加 1
            //如果字符 c 已经出现过,之前的计数会被加 1
        }

        // min为出现最少字符的出现次数
        for (int i = 0; i < 26; ++i) {
        //遍历26个字母(i表示字母位置),检查每个字母的出现次数
            if (mp[i] != 0 && mp[i] < min)
                min = mp[i];
        }
        //如果某个字母出现的次数不为0且小于当前min的值,就更新min为这个次数

        // 当字符出现次数大于min时,便输出该字符
        for (char c : str) {
        //再次遍历字符串中的每个字符
            if (mp[c - 'a'] > min) {
                cout << c;
            }
        }//如果该字符的出现次数大于min(即大于最少出现次数),则输出该字符
    }
    return 0;
}

这段代码的功能是计算输入字符串中出现次数最少的字符的出现次数,并输出所有出现次数大于该最少出现次数的字符

这段代码的核心思路是:

  1. 计算每个字符在字符串中的出现次数
  2. 找出出现次数最少的字符次数
  3. 输出那些出现次数大于最小出现次数的字符