【leetcode系列】小菜鸡的leetcode第12题:轮转数组

此题有坑,一是在原地址更新的坑nums[:],二是注意“”轮转数组“”的坑,也就是说k可以大于n=len(nums),是一个动态的循环过程,因此每一批k=n的轮回后,又变成了重复相同数组的轮转。因此结果需要k%n 对n取余。

思路图解如下:

 

'''
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
'''
#本题解答需注意一个问题:
#关于是否必须用 nums[:]:nums[:] = XX 的赋值,nums 的地址不变;
#nums = XX的赋值,nums 是新地址
#本题leetcode无需return,其自动定义的函数 的 IDE 直接调输入 nums 的地址(在def注释里写的),因此必须使用mus[:]才可以返回原地址的值

#还需注意,本题为“轮转数组”,并非为简单的切片拼接。当轮转值k>=len(nums)数组长度时候,重复回到原数组后,又进行新的一遍轮转工作
#因此,需要对k%len(nums)取余

#法一:最符合理解思路
class Solution:
    def rotate(self, nums, k):
        n=len(nums)
        k=k % n
        nums[:]=nums[n-k:]+nums[:n-k]#nums[:]=在原地址上进行覆盖修改;nums=则开辟新的地址
        return nums
'''
#法二:翻转数组reverse,不开辟新内存
class Solution:
    def rotate(self, nums, k):
        n=len(nums)
        k%= n
        nums.reverse()
        nums[:]=list(reversed(nums[:k]))+list(reversed(nums[k:]))
        return nums
'''
if __name__=='__main__':
    nums = [1, 2, 3, 4, 5, 6, 7]
    #k = 3
    #nums = [-1, -100, 3, 99]
    #k = 2
    #nums=[1,2]
    k=3
    a=Solution()
    print(a.rotate(nums,k))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值