【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)  

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值