leetcode-solution python3【189】---rotate array

1.暴力检索
  采用循环的方式,直接对每一位进行相应的移位。这里需要注意它使用的方法是将前面的元素从第0位开始依次与最后一位交换,这样的结局恰好就可以实现将最后一位移到首尾,然后后面的位数依次向后移的效果。将这个过程循环k次即可得到结果。虽然其空间复杂度为O(1),类似于在原地进行了运算,但是其时间复杂度为O(n*K),所以在检测时会因为时间复杂度超时而不能过检。其代码如下:

class Solution:
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        for i in range(k):
            previous=nums[len(nums)-1]
            for j in range(len(nums)):
                temp=nums[j]
                nums[j]=previous
                previous=temp
        return nums


2.使用额外的数组
  另一种想法是再创造一个数组,将下标为i的元素都放在下标为i+k的位置,最后再将正确的值赋给原来的数组。这个有个小tip,就是要将数组后面的元素放到前面来实现循环k位,可以将所有元素的下标都加上k然后对数组长度进行取余,那么就自动实现了循环了!

  下面将针对我写代码过程中遇到的一些问题来阐明需要注意的一些点。

   1.首先,我是想将新的列表设为空列表的。但是需要注意的是空列表必须从a[0]开始赋值,而不能直接从a[k]开始赋值,因此会报关于下标的错误。

   2.关于得到新的数组,将其赋予给原数组的问题。一开始我想采用nums=a[:]进行直接赋值,但需要注意的是在函数中,这样的操作实际上可以看成是改变了nums指针的位置,而nums本身的值并没有发生变化,要想改变它的值,必须使用下标或者无返回值的那些方法才可以。

   其代码如下:

class Solution:
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        a=nums[:]
        for i in range(len(nums)):
            a[(i+k)%(len(nums))]=nums[i]
        for j in range(len(nums)):
            nums[j]=a[j]
   其时间复杂度为O(n),其空间复杂度也为O(n)

3.采用切片的方法
    我们观察实现的数组,比如原数组为[1,2,3,4,5,6,7],k=3,则我们应该得到的翻转后的数组应该为[5,6,7,1,2,3,4],我们可以看成先将它从4,5之间切开,然后将后面的部分加上前面的部分从而组成一个新的数组。其代码为:

class Solution:
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        nums[:]=nums[len(nums)-k:]+nums[:(len(nums)-k)]


需要注意的是,一定要写成nums[:]才会对nums进行修改,如果只写成nums,是不会改变它的值的。
--------------------- 
作者:revivre 
来源:CSDN 
原文:https://blog.csdn.net/revivre/article/details/80141276 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值