解题思路:
- 先把最简单的移动0位处理掉,移动0位直接返回原列表就行了
- 当移动位数超过列表长度的时候,需要取余,本题有n=6,m=7的情况,就以此为例:列表长度为6,移动7位则相当于移动一整轮多1位
m = m % n --- m = 7 % 6 最后m的值为1 - 把整个列表翻转一下,比如: [1,2,3,4,5,6] --- [6,5,4,3,2,1]
- 我们希望的结果是: [5,6,1,2,3,4]
- 观察一下,移动位数n为2,那么最后的结果就是以n为分界线,左右两边首尾交换
- 定义一个专门处理首位交换的函数reverse,定义两个索引start和end,第一项和最后一项交换、第二项和倒数第二项交换,以此类推
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 旋转数组
# @param n int整型 数组长度
# @param m int整型 右移距离
# @param a int整型一维数组 给定数组
# @return int整型一维数组
#
class Solution:
def solve(self , n: int, m: int, a: List[int]) -> List[int]:
# write code here
if n == 0:
return a
m = m % n
res = a[::-1]
self.reverse(res, 0, m-1)
self.reverse(res, m, n-1)
return res
def reverse(self, res, start, end):
while start < end:
temp = res[start]
res[start] = res[end]
res[end] = temp
start += 1
end -= 1