python旋转数组_Python3实现旋转数组的3种算法

一、试题

给出一个数组,将数组中的元素往右边移动k个位置,当中k是非负数。

比如说:

输入:[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]*

反映:

1.竭尽所能想到越多的解决方案,起码有三种不一样的方法能够处理这个问题。

2.必须要使用空间复杂度为O(1)的原地算法。

二,解题算法

解法一

以倒数第k个值为分界线,把nums截成两组再搭配。由于k可能超过nums的长度(当这两者一样的过程中,就等同于nums不存在移动),故此大家取k%len(nums),k和nums的长度取余,便是最终大家必须要移动的位置

代码给出:if nums:

k = k % len(nums)

nums[:]=nums[-k:]+nums[:-k]时间:64ms

假设:

nums= [1,2,3,4,5,6,7]

k =3

运行结果:

[5, 6, 7, 1, 2, 3, 4]

解法二

先把nums最后一位移动到第一位,随后删除最后一位,循环k次。k=k%len(nums),取余

代码给出:if nums:

k = k % len(nums)

while k > 0:

k -= 1

nums.insert(0, nums[-1])

nums.pop()时间:172ms

假设:

nums= [1,2,3,4,5,6,7]

k =3

运行结果:

[5, 6, 7, 1, 2, 3, 4]

解法三:

先把nums复制到old_nums,随后nums中索引为x的元素移动k个位置后,当前索引为x+k,其值为old_nums[x]。,故此大家把x+k处理成(x+k)%len(nums),取余操作,减少重复的次数。

代码给出:if nums:

old_nums = nums[:]

l = len(nums)

for x in range(l):

nums[(x+k) % l] = old_nums[x]时间:64ms

假设:

nums= [1,2,3,4,5,6,7]

k =3

运行结果:

[5, 6, 7, 1, 2, 3, 4]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值