文章

【GESP】C++三级练习 luogu-B2110 找第一个只出现一次的字符

GESP三级练习,字符串和数组练习(C++三级大纲中5号知识点,一维数组和6号知识点,字符串),难度★★☆☆☆。

luogu-B2110 找第一个只出现一次的字符

题目要求

题目描述

给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出 no

输入格式

一个字符串,长度小于 $1100$。

输出格式

输出第一个仅出现一次的字符,若没有则输出 no

输入输出样例 #1

输入 #1

1
abcabd

输出 #1

1
c

输入输出样例 #2

输入 #2

1
aabbcc

输出 #2

1
no

题目分析

解题思路

  1. 题目要求找出字符串中第一个只出现一次的字符,如果没有则输出”no”。

  2. 解题关键点:
    • 需要统计每个字符出现的次数
    • 需要按照原字符串顺序查找第一个只出现一次的字符
    • 字符串只包含小写字母,可以用数组记录频次
  3. 具体思路:
    • 使用一个长度为26的数组,记录每个小写字母出现的次数
    • 第一次遍历字符串,统计每个字符出现的频次
    • 第二次遍历字符串,找到第一个频次为1的字符即为答案
    • 如果遍历完都没有找到频次为1的字符,输出”no”
  4. 时间复杂度分析:
    • 需要两次遍历字符串,时间复杂度为O(n)
    • 空间复杂度为O(1),因为字母表大小是固定的26


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>

int main() {
    // 定义字符串变量存储输入
    std::string str;
    std::cin >> str;
    
    // 定义数组记录每个字母出现次数,初始化为0
    int str_ary[26] = {0};
    char idx = 'a';
    
    // 第一次遍历:统计每个字母出现次数
    for (int i = 0; i < str.size(); i++) {
        str_ary[str[i] - idx]++;
    }
    
    // 第二次遍历:找到第一个只出现一次的字母
    for (int i = 0; i < str.size(); i++) {
        if (str_ary[str[i] - idx] == 1) {
            std::cout << (char)str[i] << std::endl;
            return 0;
        }
    }
    
    // 没有只出现一次的字母,输出no
    std::cout << "no";
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权