下面是Python3實(shí)現(xiàn)的旋轉(zhuǎn)數(shù)組的3種算法。
一、題目
給定一個(gè)數(shù)組,將數(shù)組中的元素向右移動(dòng)k個(gè)位置,其中k是非負(fù)數(shù)。
例如:
輸入:[1,2,3,4,5,6,7]和k=3
輸出:[5,6,7,1,2,3,4]
解釋:
向右旋轉(zhuǎn)1步:[7,1,2,3,4,5,6]
向右旋轉(zhuǎn)2步:[6,7,1,2,3,4,5]
向右旋轉(zhuǎn)3步:[5,6,7,1,2,3,4]
說(shuō)明:
1.盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個(gè)問(wèn)題。
2.要求使用空間復(fù)雜度為O(1)的原地算法。
二、解題算法
解法一
以倒數(shù)第k個(gè)值為分界線,把nums截成兩組再組合。因?yàn)閗可能大于nums的長(zhǎng)度(當(dāng)這兩者相等的時(shí)候,就相當(dāng)于nums沒(méi)有移動(dòng)),所以我們?nèi)%len(nums),k和nums的長(zhǎng)度取余,就是最終我們需要移動(dòng)的位置
代碼如下:
ifnums:
k=k%len(nums)
nums[:]=nums[-k:]+nums[:-k]
時(shí)間:64ms
假設(shè):
nums=[1,2,3,4,5,6,7]
k=3
運(yùn)行結(jié)果:
[5,6,7,1,2,3,4]
解法二
先把nums最后一位移動(dòng)到第一位,然后刪除最后一位,循環(huán)k次。k=k%len(nums),取余
代碼如下:
ifnums:
k=k%len(nums)
whilek>0:
k-=1
nums.insert(0,nums[-1])
nums.pop()
時(shí)間:172ms
假設(shè):
nums=[1,2,3,4,5,6,7]
k=3
運(yùn)行結(jié)果:
[5,6,7,1,2,3,4]
解法三
先把nums復(fù)制到old_nums,然后nums中索引為x的元素移動(dòng)k個(gè)位置后,當(dāng)前索引為x+k,其值為old_nums[x]。,所以我們把x+k處理成(x+k)%len(nums),取余操作,減少重復(fù)的次數(shù)。
代碼如下:
ifnums:
old_nums=nums[:]
l=len(nums)
forxinrange(l):
nums[(x+k)%l]=old_nums[x]
時(shí)間:64ms
假設(shè):
nums=[1,2,3,4,5,6,7]
k=3
運(yùn)行結(jié)果:
[5,6,7,1,2,3,4]
以上內(nèi)容為大家介紹了Python3實(shí)現(xiàn)旋轉(zhuǎn)數(shù)組的3種算法,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.2667701.com/