一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后 M 个数循环移至最前面的 M 个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
数据范围:,
进阶:空间复杂度 ,时间复杂度
6,2,[1,2,3,4,5,6]
[5,6,1,2,3,4]
4,0,[1,2,3,4]
[1,2,3,4]
(1<=N<=100,M>=0)
class Solution: def solve(self , n: int, m: int, a: List[int]) -> List[int]: # write code here if n == 0: return a # 区间[0, 3) def reverse(arr, begin, end): left = begin right = end - 1 while left < right: arr[left], arr[right] = arr[right], arr[left] left += 1 right -= 1 # 操作是周期的 m = m % n # 全部翻转: reverse(a, 0, len(a)) # 翻转前面部分: reverse(a, 0, m) # 翻转后面的部分: reverse(a, m, len(a)) return a
class Solution: def solve(self , n: int, m: int, a: List[int]) -> List[int]: # write code here for i in range(m): a.insert(0,a[-1]) a.pop() return a我觉得这样写也挺简单的啊
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 旋转数组 # @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==1: return a if m==0: return a elif m>n: m=m%n for i in range(m): x =a.pop() a.insert(0,x) return a
class Solution: def solve(self , n: int, m: int, a: List[int]) -> List[int]: list_a = [] res = [] if m >= n: m = m % n for i in range(m): list_a.insert(0,a[-1]) a.pop() res = list_a + a return res # write code here
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 旋转数组 # @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]: m = m % n if m < n/2: for i in range(m): x = a.pop() a.insert(0, x) else: for i in range(n-m): x = a.pop(0) a.append(x) return a
# # 旋转数组 # @param n int整型 数组长度 # @param m int整型 右移距离 # @param a int整型一维数组 给定数组 # @return int整型一维数组 # 整体思想:从a[0]开始右移,目标位置替出来到缓冲区buf。循环数组个数,就能把整个数组右移完。移动数据的次数最大为n。 class Solution: def solve(self , n , m , a ): if m%n == 0: # 如果右移距离是长度的倍数,那就直接返回原数组 return a m = m%n # 右移次数大于数组长度的话当作右移大于数组长度多少来处理。 index = m # 初始位置设置在第一个要被换走的数 buf = a[0] if n%m == 0: # 如果数组长度是右移距离的倍数,那移动倍数此之后,就得换到从a[1]开始移动的地方了。不然会重复移动,是不同轮回的 time = n/m for i in range(n): if time==0: buf = a[1] index = (1+m)%n time = n/m a[index],buf = buf,a[index] index = (index+m)%n time -= 1 else: for i in range(n): # 如果不是整数倍,那一直移动下去都不会重复。 a[index],buf = buf,a[index] index = (index+m)%n return a # write code here