《找出最长的神奇数列》题目解析 | 豆包MarsCode AI刷题

83 阅读3分钟

1. 思路解析

  • 初始化变量:设置max_length用于记录最长神奇数列的长度,初始化为 0;start_index用于记录最长神奇数列的起始位置,初始化为 0;current_length用于记录当前正在统计的数列长度,初始化为 0;current_start用于记录当前数列的起始位置,初始化为 0。
  • 遍历输入字符串:逐个字符检查输入字符串inp中的字符。
  • 计数与更新:如果当前字符为0,且当前数列长度current_length为奇数(意味着前面是连续的1),则current_length加 1;否则,将当前位置i作为新的起始位置current_start,并将current_length重置为 1。如果当前字符为1,且当前数列长度current_length为偶数(意味着前面是连续的0),则current_length加 1;否则,同样将当前位置i作为新的起始位置current_start,并将current_length重置为 1。
  • 检查与更新最长神奇数列:在每次更新current_length后,检查current_length是否大于等于max_length且大于等于 3。如果是,则更新max_lengthcurrent_length,并更新start_indexcurrent_start
  • 返回结果:遍历完整个字符串后,返回从start_index开始,长度为max_length的子串,即为最长的神奇数列。

2. 图解(以inp = "0101011101"为例)

步骤字符当前数列长度(current_length当前数列起始位置(current_start最长神奇数列长度(max_length最长神奇数列起始位置(start_index
101000
212000
303232
414242
505454
616464
711(重置,因为不满足交替)764
812(继续新的计数)764
903(新的交替数列开始)864
1014(继续交替)864

3. 代码详解

以下是对代码中关键部分的详细解释:

def solution(inp):
    max_length = 0  # 记录最长神奇数列的长度
    start_index = 0  # 记录最长神奇数列的起始位置
    current_length = 0  # 记录当前正在统计的数列长度
    current_start = 0  # 记录当前数列的起始位置

    for i in range(len(inp)):  # 遍历输入字符串
        if inp[i] == '0':
            if current_length % 2 == 1:  # 如果当前数列长度为奇数(前面是连续的1)
                current_length += 1
            else:  # 否则,开始新的数列
                current_start = i
                current_length = 1
        else:  # 同理,处理当前字符为1的情况
            if current_length % 2 == 0:
                current_length += 1
            else:
                current_start = i
                current_length = 1

        if current_length >= max_length and current_length >= 3:  # 检查是否更新最长神奇数列
            max_length = current_length
            start_index = current_start

    return inp[start_index:start_index + max_length]  # 返回最长的神奇数列

在上述代码中,我遍历输入字符串。当遇到与当前计数奇偶性不同的字符时,更新当前计数和起始位置。如果当前计数大于等于最大长度且大于等于 3,更新最大长度和起始索引。最后返回最长的神奇数列子串。