【leetcode】189. 轮转数组(python)+ 本地测试
思路分析:原地修改,不使用额外空间(已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)