一、题目解析:找出最长的神奇数列
题目描述:
小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?
如果有多个神奇数列,那么输出最先出现的一个。
1、题目分析
这道题要求找出一个序列中最长的“神奇数列”,“神奇数列“就是0,1交替出现的数列。我们需要用到string的遍历,分别找出当前字符作为开头所对应“神奇数列”的长度,并记录最长“神奇数列”的起始字符位置和“神奇数列”的长度。
2、算法分析
max_len来记录最长“神奇数列”的长度 max_start来记录最长“神奇数列”的起始字符的位置 current_start来记录当前起始字符的位置 current_len来记录当前字符作为起始字符所对应的“神奇数列”的长度
代码实现
#include <iostream>
#include <string>
using namespace std;
std::string solution(const std::string& inp) {
int max_len = 0;
int max_start = 0;
int current_start = 0;
int current_len = 1;
for (int i = 1; i < inp.size(); ++i) {
if (inp[i] != inp[i - 1]) {
current_len++;
} else {
if (current_len >= 3) {
if (current_len > max_len) {
max_len = current_len;
max_start = current_start;
}
}
current_start = i;
current_len = 1;
}
}
if (current_len >= 3 && current_len > max_len) {
max_len = current_len;
max_start = current_start;
}
return inp.substr(max_start, max_len);
}
代码详解
利用循环遍历来依次找出当前字符作为起始字符的“神奇数列”的长度,如果current_len>max_len,则对max_start和max_len进行更新,要注意“神奇数列”长度最短为3,所以我们需要用if来进行依次判断。 要注意,假如遍历到最后current_len依旧在增加,我们需要再次进行判断,再进行一次数据的更新。 当当前字符和前一个字符不同,则继续记录长度。如果不同,则进行判断,看当前的current_len是否满足最短“神奇数列”的要求,然后再次进行判断是否要对max_start和max_len进行更新。 更新后如果没有遍历完当前字符串,则重置current_len和current_start。
二、知识总结
本题考点为对数据的实时更新以及了解如何得到string的长度,及时对数据进行判断更新.要考虑特殊情况,需要在循环遍历之后再次进行一次判断。
三、学习计划
1、可以针对自己的知识薄弱点进行相应的刷题训练,通过做题来提高自己的知识掌握程度。 2、利用豆包MarsCode AI来掌握解题思路,扩展自己的知识层面,针对知识薄弱点来提升自己。 3、对自己没有掌握的题进行整理,找到并且补充自己的薄弱点。