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

115 阅读3分钟

题目介绍

问题描述

小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由 0 和 1 组成的正整数序列,长度为 n。这个序列中的 1 和 0 交替出现,且至少由 3 个连续的 0 和 1 组成的部分数列称为「神奇数列」。例如,10101 是一个神奇数列,而 1011 不是。现在,小F想知道在这个序列中,最长的「神奇数列」是哪一个。你能帮他找到吗?

如果有多个神奇数列,那么输出最先出现的一个。


测试样例

样例1:

输入:inp = "0101011101"
输出:'010101'

样例2:

输入:inp = "1110101010000"
输出:'10101010'

样例3:

输入:inp = "1010101010101010"
输出:'1010101010101010'

思路描述

初步思路

这个题目存在一个由0 和 1 组成的正整数序列,并且在这个数组中0 和 1 是交替出现,要求是至少有三个连续的0或者1就满足题目中要求的神奇数列的概念,当时被这个话迷惑了很久,甚至还让我一度质疑这个题目是否正确,其实就是说,数列中的0与1是不要要求交替出现的,但是这个神奇数列里面是要求交替出现,并且有至少三个!!这里的三个其实也没有写明白,其实是0与1加起来要超过三个,而不是0与1分别要三个,这个题目真的是可以改进一下,这也就是解释了为啥是10101 是一个神奇数列,而 1011 不是。题目中要求输出第一个最长的神奇数列。

详细思路

数组其实全部都是遍历,我们还是按照遍历来处理,同时涉及到了子数组的问题,那么就需要利用到双指针来进行处理,对于数组,有一个索引为i,表示数组的开头,然后从左往右依次设计一个额外的指针索引j来模拟子数组的出现。那么按照i和j的移动,我们可以得到所有的子数组的情况,这里需要注意数组里面是字符串,要用到string类型的数据结构,判断是否是01交替,只需要确认相邻的两个元素是否一致就行。然后找到当时最长的数组,并且与全局变量进行比较,更新全局变量。当遍历完所有的情况的时候,这个时候全局变量中存储的就是答案。返回这个答案,那么这个问题就迎刃而解的。
需要注意的是,数组的初始初始长度要注意好,并且要满足3这种情况,同时如何确保输出的一定是第一个,这里就可以用到if (temp > lens) 进行判断,逻辑也很简单,如果我有两个数列都是满足最长的,第一个数列进来的时候就可以更新答案,因为他一定会比目前的len要长,但是第二个进来的时候发现他长度和第一个一样,就不会触发更新。

代码

std::string solution(const std::string &inp) {
  // Edit your code here
  int n = inp.size();
  int lens = 2;
  std::string res = "";
  for (int i = 0; i < n; i++) {
    int temp = 1;
    std::string ans = "";
    ans += inp[i];
    for (int j = i + 1; j < n; j++) {
      if (inp[j] != inp[j - 1]) {
        temp++;
        ans += inp[j];
      } else {
        break;
      }
    }
    if (temp > lens) {
      res = ans;
      lens = temp;
    }
  }
  return res;
}