You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找指定步长r且长度至少为n的连续等差数列子序列的编程问题求助

寻找指定步长r且长度至少为n的连续等差数列子序列的编程问题求助

看起来你在这个等差数列子序列的编程题上遇到了瓶颈,我来帮你梳理下代码里的问题,再给你调整成符合要求的写法~

首先先明确题目要求(方便对照):

编写程序读取两个严格大于1的整数n和r,接着读取一个整数序列,判断序列中是否存在长度至少为n的连续子序列,构成步长为r的等差数列。
如果存在,输出该子序列的前n个元素;否则输出提示:"No arithmetic progression found with step r and length at least n"。

你的代码里的问题分析

  1. 序列处理逻辑错误:你每次检测到符合条件的相邻元素时,就把prev和curr都加入nl,这会导致列表里出现重复元素(比如连续三个数a, a+r, a+2r,nl会变成[a,a+r,a+r,a+2r]),最后用sorted(set(nl))去重排序更是完全不符合要求——题目要的是连续的、有序的原序列片段,不能去重或打乱顺序。
  2. 计数逻辑未处理中断:当遇到不符合步长的元素时,你没有重置count和nl,这会导致后续的计数错误,比如前面有一段连续2个符合的元素,中间断了一个,后面又出现符合的,count会继续累加,而不是重新从1开始。
  3. 初始值设置不合理:把prev初始化为-0.1虽然因为题目中r是大于1的整数不会直接出错,但逻辑上不严谨,应该直接读取序列的第一个元素作为初始的prev。
  4. 输出时机错误:当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:14:49