
本文讲解如何高效识别输入整数序列中是否存在长度至少为 n、公差为 r 的连续等差子序列,并在找到时准确输出前 n 个元素;重点剖析常见逻辑错误(如未重置计数器和缓存列表)及优化实现方案。
本文讲解如何高效识别输入整数序列中是否存在长度至少为 n、公差为 r 的连续等差子序列,并在找到时准确输出前 n 个元素;重点剖析常见逻辑错误(如未重置计数器和缓存列表)及优化实现方案。
在解决“查找指定长度与公差的连续等差子序列”问题时,关键在于维护一个动态滑动窗口——即一个始终代表当前正在延伸的、满足公差条件的连续子序列的列表。许多初学者会误用独立的 count 变量和 prev 缓存,导致状态混乱、重复添加、无法及时中断无效路径等问题。
核心思路是:
- 每读入一个新数字
curr,检查它是否能延续当前已有的等差序列(即curr - nl[-1] == r); - 若不能延续,则清空当前缓存
nl.clear(),重新以curr作为新序列的起点; - 若能延续,则将
curr加入nl,此时len(nl)即为当前连续等差序列的长度; - 一旦
len(nl) == n,立即输出*nl并终止读取(避免后续干扰); - 若遍历结束仍未触发
break,则通过while-else结构统一处理失败情况。
以下是符合规范、健壮且高效的 Python 实现(基于 yogi.scan 输入):
from yogi import scan
n = scan(int)
r = scan(int)
curr = scan(int)
# 初始化:nl 至少包含第一个数,作为潜在等差序列的起点
nl = [curr]
while curr is not None:
# 若 curr 无法延续当前等差序列(即与末尾元素差值 ≠ r),则重置
if len(nl) > 0 and curr - nl[-1] != r:
nl.clear()
# 无论是否延续,curr 都是新序列(或延续序列)的最新成员
nl.append(curr)
# 满足长度要求:输出前 n 个元素并退出
if len(nl) == n:
print(*nl)
break
curr = scan(int)
else:
# while 正常结束(无 break),说明全程未找到有效序列
print(f"No arithmetic progression found with step {r} and length at least {n}")⚠️ 注意事项:
- 切勿在判断条件中使用
prev单独变量——它易与nl状态脱节;应始终依赖nl[-1]获取上一元素,确保数据一致性; - 不要提前
append(prev)或多次append同一元素(如原代码中nl.append(prev); nl.append(curr)),这会引入冗余甚至错误顺序; -
set()和sorted()的滥用不仅低效,更掩盖了逻辑缺陷(如非连续元素被错误拼凑);本解法保证nl中元素天然有序、连续、无重复; -
while-else是 Python 中处理“循环未中断即失败”的惯用模式,比手动维护found标志更简洁可靠。
该方案时间复杂度为 O(L),L 为输入序列长度,空间复杂度为 O(n),完全满足题目约束与工程实践要求。

















