今天,小F学习了数列的概念,并且遇到了一个有趣的问题:在一个由0和1组成的正整数序列中,找出最长的「神奇数列」。「神奇数列」定义为:序列中的1和0交替出现,并且至少由3个连续的0或1组成的部分数列。
-
输入与输出:
- 输入:一个由0和1组成的字符串,长度为n。
- 输出:最长的「神奇数列」,如果有多个,则输出最先出现的一个。
-
「神奇数列」的定义:
- 序列中的1和0交替出现。
- 至少包含3个连续的0或1。
-
解题步骤:
- 遍历整个字符串,寻找所有可能的「神奇数列」。
- 记录每个「神奇数列」的长度和起始位置。
- 比较所有「神奇数列」的长度,找到最长的并输出。
三、具体实现
-
初始化变量:
max_len
:记录当前找到的最长「神奇数列」的长度。max_start
:记录当前找到的最长「神奇数列」的起始位置。current_len
:记录当前遍历到的「神奇数列」的长度。current_char
:记录当前遍历到的字符(0或1)。prev_char
:记录前一个字符(0或1),用于判断交替。
-
遍历字符串:
- 遍历整个字符串,从第一个字符开始。
- 初始化
prev_char
为第一个字符,current_len
为1。 - 从第二个字符开始,如果当前字符与前一个字符不同且当前字符与前一个字符相同(即交替出现),则
current_len
加1。 - 如果当前字符与前一个字符相同,则检查
current_len
是否大于等于3(满足「神奇数列」的条件),如果是,则更新max_len
和max_start
(如果current_len
更长)。 - 重置
current_len
为1,并更新prev_char
为当前字符。
-
输出结果:
- 根据
max_start
和max_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理解数列的概念和解决实际问题有所帮助,期待他在未来的学习中取得更多进步!
- 根据