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
相关产品推荐
相关产品推荐

