128找出最长的神奇数列 | 豆包MarsCode AI刷题

91 阅读3分钟

一、题目解析:找出最长的神奇数列

题目描述:

小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、对自己没有掌握的题进行整理,找到并且补充自己的薄弱点。