练习心得 | 豆包MarsCode AI刷题

3 阅读3分钟

今天,小F学习了数列的概念,并且遇到了一个有趣的问题:在一个由0和1组成的正整数序列中,找出最长的「神奇数列」。「神奇数列」定义为:序列中的1和0交替出现,并且至少由3个连续的0或1组成的部分数列。

  1. 输入与输出

    • 输入:一个由0和1组成的字符串,长度为n。
    • 输出:最长的「神奇数列」,如果有多个,则输出最先出现的一个。
  2. 「神奇数列」的定义

    • 序列中的1和0交替出现。
    • 至少包含3个连续的0或1。
  3. 解题步骤

    • 遍历整个字符串,寻找所有可能的「神奇数列」。
    • 记录每个「神奇数列」的长度和起始位置。
    • 比较所有「神奇数列」的长度,找到最长的并输出。

三、具体实现

  1. 初始化变量

    • max_len:记录当前找到的最长「神奇数列」的长度。
    • max_start:记录当前找到的最长「神奇数列」的起始位置。
    • current_len:记录当前遍历到的「神奇数列」的长度。
    • current_char:记录当前遍历到的字符(0或1)。
    • prev_char:记录前一个字符(0或1),用于判断交替。
  2. 遍历字符串

    • 遍历整个字符串,从第一个字符开始。
    • 初始化prev_char为第一个字符,current_len为1。
    • 从第二个字符开始,如果当前字符与前一个字符不同且当前字符与前一个字符相同(即交替出现),则current_len加1。
    • 如果当前字符与前一个字符相同,则检查current_len是否大于等于3(满足「神奇数列」的条件),如果是,则更新max_lenmax_start(如果current_len更长)。
    • 重置current_len为1,并更新prev_char为当前字符。
  3. 输出结果

    • 根据max_startmax_len从原字符串中截取最长「神奇数列」。def find_longest_magical_sequence(inp): max_len = 0 max_start = 0 current_len = 1 prev_char = inp[0] for i in range(1, len(inp)): current_char = inp[i] if current_char != prev_char: current_len += 1 else: if current_len >= 3: if current_len > max_len: max_len = current_len max_start = i - current_len + 1 current_len = 1 prev_char = current_char # Check the last sequence if current_len >= 3: if current_len > max_len: max_len = current_len max_start = len(inp) - current_len return inp[max_start:max_start + max_len] # 测试样例 print(find_longest_magical_sequence("0101011101")) # 输出: '010101' print(find_longest_magical_sequence("1110101010000")) # 输出: '10101010' print(find_longest_magical_sequence("1010101010101010")) # 输出: '1010101010101010' 总结 通过上述步骤和代码实现,我们成功地解决了小F的问题,并找出了最长的「神奇数列」。这种方法通过遍历字符串,并利用变量记录当前「神奇数列」的长度和起始位置,有效且高效地解决了问题。希望今天的训练对小F理解数列的概念和解决实际问题有所帮助,期待他在未来的学习中取得更多进步!