【GESP】C++三级练习 luogu-B2126 连续出现的字符
GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。
luogu-B2126 连续出现的字符
题目要求
题目描述
给定一个字符串,在字符串中寻找第一个连续出现次数不低于 $k$ 次的字符。
输入格式
$2$ 行。第 $1$ 行是 $k$;第 $2$ 行是仅包含大小写字母的字符串。
输出格式
字符串中第一个连续出现次数不低于
k
次的字符。如果没有符合条件的字符,输出No
。
输入输出样例 #1
输入 #1
1
2
3
abcccaaab
输出 #1
1
c
说明/提示
$1\leq k\leq1000$,字符串长度不超过 $1000$。
题目分析
解题思路
- 读取连续出现次数的阈值k
- 读取待检查的字符串str
- 遍历字符串中的每个字符:
- 记录当前字符的连续出现次数count
- 如果当前字符与前一个字符相同:
- count加1
- 否则:
- 重置count为1
- 如果count大于等于k:
- 输出当前字符并结束程序
- 如果遍历结束仍未找到符合条件的字符,输出”No”
复杂度分析:
- 时间复杂度为 $O(n)$,其中n为字符串长度
- 空间复杂度为 $O(1)$,只需要存储计数器和当前字符
示例代码
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
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <string>
int main() {
// 读取连续出现次数的阈值k
int k;
std::cin >> k;
// 读取待检查的字符串
std::string str;
std::cin >> str;
// 初始化计数器和当前字符
int count = 1; // 当前字符的连续出现次数
char cur_c = str[0]; // 当前正在检查的字符
// 遍历字符串中的每个字符(从第二个字符开始)
for (int i = 1; i < str.length(); i++) {
if (str[i] == cur_c) {
// 如果当前字符与前一个字符相同,计数器加1
count++;
} else {
// 如果当前字符与前一个字符不同,重置计数器并更新当前字符
cur_c = str[i];
count = 1;
}
// 检查是否找到符合条件的字符
if (count >= k) {
// 找到连续出现k次及以上的字符,输出并结束程序
std::cout << cur_c << 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 进行授权