寻找指定步长r且长度至少为n的连续等差数列子序列的编程问题求助
寻找指定步长r且长度至少为n的连续等差数列子序列的编程问题求助
看起来你在这个等差数列子序列的编程题上遇到了瓶颈,我来帮你梳理下代码里的问题,再给你调整成符合要求的写法~
首先先明确题目要求(方便对照):
编写程序读取两个严格大于1的整数
n和r,接着读取一个整数序列,判断序列中是否存在长度至少为n的连续子序列,构成步长为r的等差数列。
如果存在,输出该子序列的前n个元素;否则输出提示:"No arithmetic progression found with step r and length at least n"。
你的代码里的问题分析
- 序列处理逻辑错误:你每次检测到符合条件的相邻元素时,就把
prev和curr都加入nl,这会导致列表里出现重复元素(比如连续三个数a, a+r, a+2r,nl会变成[a,a+r,a+r,a+2r]),最后用sorted(set(nl))去重排序更是完全不符合要求——题目要的是连续的、有序的原序列片段,不能去重或打乱顺序。 - 计数逻辑未处理中断:当遇到不符合步长的元素时,你没有重置
count和nl,这会导致后续的计数错误,比如前面有一段连续2个符合的元素,中间断了一个,后面又出现符合的,count会继续累加,而不是重新从1开始。 - 初始值设置不合理:把
prev初始化为-0.1虽然因为题目中r是大于1的整数不会直接出错,但逻辑上不严谨,应该直接读取序列的第一个元素作为初始的prev。 - 输出时机错误:当
count达到n时,你输出的是去重排序后的列表,而不是连续子序列的前n个原元素。
修正后的代码
from yogi import scan n = scan(int) r = scan(int) # 读取第一个元素,初始化跟踪状态 prev = scan(int) if prev is None: # 题目说明序列至少有2个元素,此分支理论不会触发 print(f"No arithmetic progression found with step {r} and length at least {n}") exit() current_seq = [prev] current_len = 1 found = False curr = scan(int) while curr is not None: if curr - prev == r: current_len += 1 current_seq.append(curr) # 一旦连续长度达到要求,直接输出前n个元素并退出 if current_len >= n: print(*current_seq[:n]) found = True break else: # 序列中断,重置跟踪状态 current_len = 1 current_seq = [curr] prev = curr curr = scan(int) if not found: print(f"No arithmetic progression found with step {r} and length at least {n}")
代码关键逻辑说明
- 正确初始化:先读取序列第一个元素作为起始点,初始化当前连续序列和长度。
- 跟踪连续序列:每次检测到相邻元素差为
r时,延长当前序列并增加长度;遇到不符合的元素时,直接重置序列和长度,重新开始计数。 - 及时输出并退出:一旦当前连续序列长度达到
n,立即输出该序列的前n个元素(因为要找第一个符合条件的子序列),然后终止程序,避免不必要的后续读取。 - 保持原序列顺序:全程没有修改元素顺序或去重,完全符合题目对“连续子序列”的要求。
备注:内容来源于stack exchange,提问作者Aloal34
相关产品推荐
相关产品推荐

