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

Python数组旋转问题中for循环迭代异常求助

Codility第2.1题数组右旋问题排查

我正尝试用Python解决Codility第2.1题,任务是实现一个函数将给定数组向右旋转k次,每次旋转1位。例如,数组[0, 1, 2, 3, 4]旋转两次后,先变为[4, 0, 1, 2, 3],再变为[3, 4, 0, 1, 2]。

我计划用两层for循环实现:内层循环完成单次旋转,外层循环重复k次。目前还未编写外层循环,但内层循环的实现遇到了问题。

测试数组[0, 1, 2, 3, 4]时,返回结果为[4, 1, 2, 3, 3],而非预期的[4, 0, 1, 2, 3],仅首尾元素正确,中间元素未被循环处理(已通过打印i验证)。

以下是我的代码,请问为何for循环无法正常工作?

def Solution(A):
    N = len(A)
    A_minus_one_original = A[-1]
    for i in (-1, -N):
        if i != -N:
            A[i] = A[int(i) - 1]
            print(i)
        elif i == -N: 
            A[i] = A_minus_one_original
            print(i)
    print(A)

问题根源

你的for循环写法完全错误:for i in (-1, -N)只是遍历一个包含两个元素的元组,只会执行两次循环——第一次i=-1,第二次i=-N(也就是-5,对应数组第一个元素),根本没遍历中间的索引(-2、-3、-4),这就是中间元素没被处理的核心原因。

正确的单次右旋实现

要完成单次向右旋转,需要从最后一个元素开始,依次把前一个位置的值赋给当前位置,最后把原来的最后一个元素放到第一个位置。这里提供两种实现方式:

方式1:负索引遍历

def single_rotate_right(A):
    N = len(A)
    if N <= 1:
        return A
    last_val = A[-1]
    # 从倒数第二个元素往前遍历到第一个元素
    for i in range(-2, -N-1, -1):
        A[i] = A[i-1]
    A[0] = last_val
    return A

# 测试
test_arr = [0,1,2,3,4]
single_rotate_right(test_arr)
print(test_arr)  # 输出 [4,0,1,2,3]

方式2:正向索引遍历

def single_rotate_right(A):
    N = len(A)
    if N <= 1:
        return A
    last_val = A[-1]
    for i in range(N-1, 0, -1):
        A[i] = A[i-1]
    A[0] = last_val
    return A

完整的k次右旋实现

加上外层循环重复k次即可,注意k可能大于数组长度,所以先取模k = k % N,避免不必要的循环:

def rotate_right(A, k):
    N = len(A)
    if N <= 1 or k == 0:
        return A
    k = k % N  # 处理k大于数组长度的情况
    for _ in range(k):
        last_val = A[-1]
        for i in range(N-1, 0, -1):
            A[i] = A[i-1]
        A[0] = last_val
    return A

# 测试
test_arr = [0,1,2,3,4]
rotate_right(test_arr, 2)
print(test_arr)  # 输出 [3,4,0,1,2]

内容的提问来源于stack exchange,提问作者Blume1932

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:12:21