青训营X豆包MarsCode 技术训练营| 找出最长的神奇数列

119 阅读5分钟
方向一:学习方法与心得
  • 题目解析

找出最长的神奇数列

题目描述

题目可能给出了一个由0和1组成的数字序列,并询问在这个序列中是否存在一个最长的“神奇数列”。这里的“神奇数列”可能指的是满足某种特定条件的子序列。

条件解析

  1. 子序列定义:子序列是从原序列中删除一些(也可能不删除)元素后,剩余元素按照它们在原序列中的顺序排列而成的序列。

  2. “神奇数列”的条件:题目没有直接给出“神奇数列”的具体条件,但基于常见的数列问题,我们可以假设一些可能的条件,如:

    • 不含连续相同的数字(即,如果序列中有一个'0',那么它旁边不能紧挨着另一个'0',同样地,'1'旁边也不能紧挨着另一个'1')。
    • 或者,满足某种特定的和或乘积条件。
    • 又或者,是某种特定的数学模式(如斐波那契数列、素数序列等,但考虑到题目给出的是0和1的序列,这些可能性较小)。

    由于题目没有给出具体条件,我们需要根据题目实际给出的条件来解答。

解题步骤

  1. 理解题目:首先,确保你完全理解了题目中给出的序列和“神奇数列”的定义。
  2. 确定条件:如果题目没有明确给出“神奇数列”的条件,你可能需要向出题者询问或参考相关材料。
  3. 寻找子序列:一旦你知道了条件,就可以开始在原序列中寻找满足条件的子序列了。这可能需要你遍历整个序列,并检查每个可能的子序列是否满足条件。
  4. 确定最长序列:在找到所有满足条件的子序列后,你需要确定哪个是最长的。这可能需要你比较它们的长度。
  5. 输出结果:最后,你需要将最长“神奇数列”的长度(或序列本身,如果题目要求的话)作为答案输出。### 函数定义
python复制代码
	def solution(inp):

	    # ...
  • inp:输入参数,一个字符串,包含只由字符 '0' 和 '1' 组成的序列。

变量初始化

python
	max_length = 0

	    max_start = 0

	    current_length = 1

	    current_start = 0

	    previous_char = inp[0]
  • max_length:记录最长满足条件的子串的长度。
  • max_start:记录最长满足条件的子串的起始索引。
  • current_length:记录当前正在检查的子串的长度。
  • current_start:记录当前正在检查的子串的起始索引。
  • previous_char:记录当前字符的前一个字符,用于比较是否连续相同。

循环遍历输入字符串

	for i in range(1, len(inp)):

	        # ...
  • 从索引1开始遍历输入字符串,因为已经初始化了previous_charinp[0]

条件判断与更新变量

if inp[i] != previous_char:

            current_length += 1

        else:

            if current_length >= 3:

                if current_length > max_length:

                    max_length = current_length

                    max_start = current_start

            current_length = 1

            current_start = i

-   如果当前字符与前一个字符不同,则当前子串长度加1。
-   如果相同,则检查当前子串长度是否已达到或超过3,如果是,则与最长子串长度比较,并更新相应变量。
-   然后重置当前子串长度为1,并更新当前子串起始索引为当前字符的索引。

### 循环结束后的最终检查

if current_length >= 3 and current_length > max_length:

        max_length = current_length

        max_start = current_start

-   循环结束后,检查最后一个子串(如果它存在且长度至少为3)是否为最长子串,并更新相应变量。

### 返回结果

return inp[max_start:max_start + max_length]

-   返回最长满足条件的子串。

### 主程序

if __name__ == "__main__":

    # ...

-   主程序部分负责从用户那里获取多个测试用例,并逐个调用`solution`函数输出结果。

### 注意事项

1.  **输入验证**:函数假设输入字符串只包含字符 '0' 和 '1'。如果输入包含其他字符,函数的行为将是未定义的。
1.  **空字符串处理**:如果输入为空字符串,函数将返回空字符串(因为没有字符可以形成子串)。
1.  **性能**:函数的时间复杂度为 O(n),其中 n 是输入字符串的长度,因为它只遍历了一次输入字符串。

### 示例输出

假设输入如下测试用例:

010101

0000

1111

010011

01101001

输出将是:

Input: 010101 -> Output: 010101

Input: 0000 -> Output: 

Input: 1111 -> Output: 

Input: 010011 -> Output: 010011  011(取决于实现,因为有两个长度为4的子串满足条件)

Input: 01101001 -> Output: 01101  1001(同样取决于实现)

注意:对于最后两个测试用例,存在多个满足条件的子串,函数将返回它找到的第一个最长子串。如果需要找到所有最长子串,可以对函数进行修改以收集所有满足条件的子串,并在最后返回它们。