Python實(shí)現(xiàn)的旋轉(zhuǎn)數(shù)組功能算法示例
本文實(shí)例講述了Python實(shí)現(xiàn)的旋轉(zhuǎn)數(shù)組功能算法。分享給大家供大家參考,具體如下:
一、題目
給定一個(gè)數(shù)組,將數(shù)組中的元素向右移動(dòng) k 個(gè)位置,其中 k 是非負(fù)數(shù)。
例1:
輸入: [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]
例2:
輸入: [-1,-100,3,99] 和 k = 2
輸出: [3,99,-1,-100]
解釋:
向右旋轉(zhuǎn) 1 步: [99,-1,-100,3]
向右旋轉(zhuǎn) 2 步: [3,99,-1,-100]
說明:
1.盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個(gè)問題。
2.要求使用空間復(fù)雜度為 O(1) 的原地算法。
二、解法
解法一
以倒數(shù)第 k 個(gè)值為分界線,把 nums 截成兩組再組合。因?yàn)?k 可能大于 nums 的長(zhǎng)度(當(dāng)這兩者相等的時(shí)候,就相當(dāng)于 nums 沒有移動(dòng)),所以我們?nèi)?k % len(nums)
,k 和 nums 的長(zhǎng)度取余,就是最終我們需要移動(dòng)的位置
代碼如下:
if nums: k = k % len(nums) nums[:]=nums[-k:]+nums[:-k]
時(shí)間:64ms,擊敗了98%
附:本機(jī)測(cè)試示例代碼:
# -*- coding:utf-8 -*- nums= [1,2,3,4,5,6,7] k =3 if nums: k = k % len(nums) nums[:]=nums[-k:]+nums[:-k] print(nums)
運(yùn)行結(jié)果:
[5, 6, 7, 1, 2, 3, 4]
解法二
先把 nums 最后一位移動(dòng)到第一位,然后刪除最后一位,循環(huán)k次。k = k % len(nums)
,取余
代碼如下:
if nums: k = k % len(nums) while k > 0: k -= 1 nums.insert(0, nums[-1]) nums.pop()
時(shí)間:172ms,擊敗了16%
附:本機(jī)測(cè)試示例代碼:
# -*- coding:utf-8 -*- nums= [1,2,3,4,5,6,7] k =3 if nums: k = k % len(nums) while k > 0: k -= 1 nums.insert(0, nums[-1]) nums.pop() print(nums)
運(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ù)。
代碼如下:
if nums: old_nums = nums[:] l = len(nums) for x in range(l): nums[(x+k) % l] = old_nums[x]
時(shí)間:64ms,擊敗了98%
附:本機(jī)測(cè)試示例代碼:
# -*- coding:utf-8 -*- nums= [1,2,3,4,5,6,7] k =3 if nums: old_nums = nums[:] l = len(nums) for x in range(l): nums[(x+k) % l] = old_nums[x] print(nums)
運(yùn)行結(jié)果:
[5, 6, 7, 1, 2, 3, 4]
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)組操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python列表(list)操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
如何通過pycharm實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢等操作(非多步操作)
這篇文章主要介紹了如何通過pycharm實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢等操作(非多步操作),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07python實(shí)現(xiàn)兩張圖片拼接為一張圖片并保存
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)兩張圖片拼接為一張圖片并保存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07Python?Asyncio中Coroutines,Tasks,Future可等待對(duì)象的關(guān)系及作用
這篇文章主要介紹了Python?Asyncio中Coroutines,Tasks,Future可等待對(duì)象的關(guān)系及作用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下2022-06-06使用Python對(duì)SQLite數(shù)據(jù)庫(kù)操作
本文主要介紹了Python對(duì)SQLite數(shù)據(jù)庫(kù)操作的簡(jiǎn)單教程。SQLite是一種嵌入式數(shù)據(jù)庫(kù),它的數(shù)據(jù)庫(kù)就是一個(gè)文件。由于SQLite本身是C寫的,而且體積很小,所以,經(jīng)常被集成到各種應(yīng)用程序中,甚至在IOS和Android的APP中都可以集成。2017-04-04python數(shù)據(jù)可視化之matplotlib.pyplot基礎(chǔ)以及折線圖
不論是數(shù)據(jù)挖掘還是數(shù)據(jù)建模,都免不了數(shù)據(jù)可視化的問題,對(duì)于Python來說,Matplotlib是最著名的繪圖庫(kù),它主要用于二維繪圖,這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)可視化之matplotlib.pyplot基礎(chǔ)以及折線圖的相關(guān)資料,需要的朋友可以參考下2021-07-07