思路分析:原地修改,不使用额外空间(已AC)
思路:逆置
1.先把前n-k个元素逆置;2.再把倒数k个元素逆置;3.再整体逆置
初始顺序: [1,2,3,4,5,6] # 假设 k = 2 (轮转两次)
step 1: [4,3,2,1,5,6] # 把前n-k个元素逆置
step 2: [4,3,2,1,6,5] # 把倒数k个元素逆置
step 3: [5,6,1,2,3,4] # 整体逆置
然后,我就晃晃晃一顿,写完了,本地测试测了几个没问题。
(ps,下边这个是错的!!!)
class Solution(object): # 提交失败!!!
def reverse(self,arr): #self代表类的实例,而非类。
n = len(arr)
i, j = 0, n-1
for c in range(n//2):
tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
i += 1
j -= 1
return arr
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
n1 = len(nums)
nums[:n1-k] = self.reverse(nums[:n1-k])
nums[n1-k :] = self.reverse(nums[n1-k :])
nums[:] = self.reverse(nums[:])
# print(nums)
这样子看起来没毛病呀? 那就提交试试把!然而!我还是小瞧了测试用例。。。
嗯?肿么回事?我一想,好吧,我确实没想到,轮转次数k可以比数组长度大呢!
那我怎么确定到底轮转了多少次呢?
- 答曰:轮转次数k < 数组长度(即, k < len(nums))的话,前边的思路是没问题的。
那么k>=len(nums)的情况下呢?
- 奥!对,当轮转次数k是数组长度的整数倍的时候,相当于是原数组保持原有顺序。有了,取模!取模后的余数就是最终轮转的次数。
特殊情况(原谅我一开始没想到):
k > len(nums)? or k = len(nums)? ——> 取模
(ps, 这个才是提交成功的(已AC))
# 通过40 ms 24.3 MB Python 2022/03/16 21:54
class Solution(object):
def reverse(self,arr): #self代表类的实例,而非类。
n = len(arr)
i, j = 0, n-1
for c in range(n//2):
tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
i += 1
j -= 1
return arr
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
n1 = len(nums)
t = k % n1
if t != 0: # k < len(nums) 也一样可以用取模的写法呀
nums[:n1-t] = self.reverse(nums[:n1-t])
nums[n1-t :] = self.reverse(nums[n1-t :])
nums[:] = self.reverse(nums[:])
# print(nums) # 本地测试用的,不用care
# else:
# print(nums)
本地测试
# nums = [1,2,3,4,5,6,7]
# nums = [-1,-100,3,99]
nums = [1,2,3]
# nums = [1,2]
# 特殊情况:
# k >= len(nums)? k=0 ? k==len(nums)?
# nums = [1,2] # output:[1,2]当k=2转了两轮又转回去了==》取模!
# 若取模==0,原样;
# 若取模!=0,移动'余数'个数
s = Solution()
s.rotate(nums,3)