【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
题目分析
解题思路
题目要求找出字符串中第一个只出现一次的字符,如果没有则输出”no”。
- 解题关键点:
- 需要统计每个字符出现的次数
- 需要按照原字符串顺序查找第一个只出现一次的字符
- 字符串只包含小写字母,可以用数组记录频次
- 具体思路:
- 使用一个长度为26的数组,记录每个小写字母出现的次数
- 第一次遍历字符串,统计每个字符出现的频次
- 第二次遍历字符串,找到第一个频次为1的字符即为答案
- 如果遍历完都没有找到频次为1的字符,输出”no”
- 时间复杂度分析:
- 需要两次遍历字符串,时间复杂度为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 进行授权