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]
總結
以上是生活随笔為你收集整理的python旋转数组_Python3实现旋转数组的3种算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java重写面试题_Java面试题:重写
- 下一篇: pagerank数据集_从小白视角理解数