青训营刷题日记2| 豆包MarsCode AI 刷题

43 阅读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'

代码实现

def solution(inp):
    n = len(inp)
    max_length = 0
    longest_magic_sequence = ""
 
    i = 0
    while i < n:
        # 发现一个潜在的神奇数列
        start = i
        while i < n - 1 and inp[i] != inp[i + 1]:
            i += 1
        
        # 检查当前神奇数列的长度
        current_length = i - start + 1
        
        # 更新最长的神奇数列
        if current_length >= 3 and current_length > max_length:
            max_length = current_length
            longest_magic_sequence = inp[start:i + 1]
        
        # 移动到下一个可能的开始位置
        i += 1
 
    return longest_magic_sequence
 
if __name__ == "__main__":
    print(solution("0101011101") == "010101")
    print(solution("1110101010000") == "10101010")
    print(solution("1010101010101010") == "1010101010101010")

分析与思考

在这个问题中,我们需要找到一个由0和1组成的序列中最长的「神奇数列」,即该数列中至少包含3个连续的0和1。为了实现这一目标,我们可以采用滑动窗口的方法来遍历整个序列,并记录下每个潜在神奇数列的起始位置和长度。如果当前数列的长度大于等于3并且比之前记录的最长神奇数列更长,我们就更新最长神奇数列的信息。

具体步骤

  1. 初始化变量:首先,我们初始化一些变量,包括序列的长度n、最大长度max_length以及最长的神奇数列longest_magic_sequence
  2. 遍历序列:使用一个循环遍历整个序列。对于每一个字符,我们检查它是否与下一个字符不同(即是否形成了一个交替的数列)。如果是,则继续向后遍历,直到遇到相同的字符为止。
  3. 计算长度:在每次找到一段交替数列后,计算其长度。如果长度大于等于3并且比当前记录的最大长度要长,则更新最大长度和最长神奇数列。
  4. 返回结果:最后,返回最长的神奇数列。

通过这种方法,我们可以有效地找到最长的神奇数列,并且保证时间复杂度为O(n),因为我们只需要遍历一次序列。

个人思考与总结

这个问题不仅考察了基本的字符串操作能力,还涉及到了一些算法设计的思想。通过滑动窗口的方法,我们可以高效地解决这类问题。此外,我们还需要注意边界条件的处理,比如当序列长度小于3时,直接返回空字符串即可。

在实际编程过程中,除了掌握基本的数据结构和算法外,还需要培养良好的编码习惯和调试技巧。通过不断地练习和总结,我们可以提高自己的编程能力和解决问题的能力。