【华为od刷题(C++)】HJ59 找出字符串中第一个只出现一次的字符

我的代码:

#include //引入输入输出流,允许使用 cin 和 cout 进行输入输出操作
#include //引入字符串类,允许使用 string 类型
#include //引入 map 容器,允许使用 map 来存储键值对数据

using namespace std;
/*使得可以直接使用标准库中的标识符(如 cin, cout, string 等)
而不需要每次都写 std::*/

int main() {
    string str;//定义一个字符串变量 str,用来存储从输入读取的字符串

    while (cin >> str) {
        //循环读取每行输入,直到没有输入(如按 Ctrl+D)为止

        map m;
        //定义一个 map,它将每个字符 char 映射到它在字符串中出现的次数 int

        bool isfind = false;
        //定义一个布尔变量 isfind,用来标记是否找到第一个不重复字符

        //s统计字符串中每个字符出现的次数
        for (int i = 0; i < str.size(); ++i) {
            m[str[i]]++;
            /*m[str[i]] 访问 map 中的键 str[i],
            这个键是字符串中的每一个字符

            如果该字符 str[i] 在 map 中不存在,
            map 会自动为该字符创建一个新条目,并将其值初始化为 0
            然后通过 ++ 自增操作,更新该字符在 map 中的出现次数*/
        }
        /*str.size() 返回字符串的长度,
        循环遍历字符串中的每个字符 str[i],
        并将其在 map 中的出现次数加1*/

        //用来查找第一个出现次数为1的字符(即不重复的字符)
        for (int i = 0; i < str.size(); ++i) {
            if (m[str[i]] == 1) {//判断当前字符的出现次数是否为 1
            /*m[str[i]]:
            是一种在 C++ 中使用 std::map 访问或修改键值对的语法

            这里,m 是一个 map,str[i] 是一个字符作为键,
            m[str[i]] 表示对该键对应的值进行访问或修改*/
            
                cout << str[i] << endl;
                isfind = true;
                break;
                /*如果是,
                打印该字符,
                并设置 isfind = true,
                然后跳出循环 break,
                因为只需要找到第一个不重复的字符*/
            }
        }
        if (!isfind)
            cout << -1 << endl;
        /*如果遍历完整个字符串后,isfind 仍为 false,
        说明没有找到不重复的字符,此时输出 -1*/
    }
    return 0;//程序执行完毕,返回 0 表示程序成功终止
}

思路总结:

  1. 引入必要的库:

    • #include :引入标准输入输出流库,允许使用 cin 读取输入和 cout 输出结果
    • #include :引入字符串类,允许使用 string 类型处理字符串
    • #include :引入 map 容器,用于存储字符及其出现次数的映射关系
  2. 命名空间:

    using namespace std;:直接使用标准库中的标识符(如 cincoutstring)而无需加 std:: 前缀
  3. 输入字符串并处理:

    • 定义一个字符串 str 来存储从输入读取的数据
    • 使用 while(cin >> str) 循环读取输入,直到没有更多输入为止
  4. 统计字符出现次数:

    • 定义一个 map m; 来记录每个字符出现的次数
    • 遍历输入字符串,将每个字符作为键,字符出现的次数作为值存入 map
  5. 查找第一个不重复字符:

    • 使用第二个 for 循环遍历字符串
    • 对每个字符,判断其在 map 中出现的次数是否为 1
    • 如果找到第一个不重复的字符,输出该字符并设置 isfind = true,然后跳出循环
  6. 未找到不重复字符:

    如果遍历完整个字符串后,仍然没有找到不重复的字符,输出 -1
  7. 程序结束:

    程序执行完成后,返回 0 表示成功终止

总体思路:

  1. 统计字符频次: 通过 map 容器统计字符串中每个字符出现的次数
  2. 查找并输出第一个不重复字符: 遍历字符串,找到第一个出现次数为 1 的字符并输出
  3. 无不重复字符时输出 -1 如果没有不重复的字符,则输出 -1

代码流程:

  • 输入字符串,并为每个字符串构建一个 map 来统计字符出现次数
  • 查找第一个不重复的字符,如果找到了则输出该字符并结束查找
  • 没有找到不重复字符时,输出 -1

你可能感兴趣的:(【华为od刷题(C++)】HJ59 找出字符串中第一个只出现一次的字符)