網站首頁 編程語言 正文
python數組平移K位
def move(ls: list, offset):
"""
元素原索引+位移數(正為右移,負為左移)之和求關于數組長度(數組的模)的余數,即為位移后的元素索引。
再對新索引升序排序,去除索引,即為位移后的新數組
:param ls:
:param offset:
:return:
"""
mod = len(ls)
ids = [[(item[0]+offset)%mod, item[1]] for item in enumerate(ls)]
ids.sort(key=lambda item: item[0])
return [item[1] for item in ids]
def move2(ls: list, offset):
"""
分段反轉,以位移數(對模求余)為界,分別反轉兩個子數組,再整體反轉
:param ls:
:param offset:
:return:
"""
mod = len(ls)
offset = offset % mod
tail = list(reversed(ls[mod-offset:]))
head = list(reversed(ls[:mod-offset]))
return list(reversed(head+tail))
if __name__ == '__main__':
nums = [8, 9, 10, 11]
print(move(nums, 1))
print(move2(nums, 1))
print(move(nums, -1))
print(move2(nums, -1))
"""
[11, 8, 9, 10]
[11, 8, 9, 10]
[9, 10, 11, 8]
[9, 10, 11, 8]
"""
Python對數組進行循環移位
要求
對含有N個元素的數組循環右移K位,要求時間復雜度為O(N),且只允許使用兩個附加變量。
分析
方法一:蠻力法
要求將數組元素循環右移K位,只需要每次將數組中元素右移一位,循環K次即可。如原數組為abcd1234,右移4位具體移動過程為abcd1234-->4abcd123-->34abcd12-->1234abcd。
方法二:翻轉法
直接上例子,對于數組序列A = [123456],如何實現循環右移2位功能?將數組A分成兩個部分A[0,N-K-1]和A[N-K,N-1],將這兩部分分別翻轉,然后放在一起再翻轉,具體如下:
- ①翻轉1234:123456-->432156
- ②翻轉56:432156-->432165
- ③翻轉432165:432165-->561234
代碼實現
#方法一
# -*- coding:utf-8 -*-
def rightShift(arr,k):
? ? if arr == None:
? ? ? ? print("參數不合法!")
? ? ? ? return
? ? lens = len(arr)
? ? k %= lens #因為K不一定小于N,有可能大于等于N,當K≥N時,右移K-N與右移K位效果一樣
? ? while k != 0: #右移k位
? ? ? ? tmp = arr[lens-1] #數組最后一個元素放入臨時變量中
? ? ? ? i = lens-1
? ? ? ? while i > 0:
? ? ? ? ? ? arr[i] = arr[i-1] #所有元素后移
? ? ? ? ? ? i -= 1
? ? ? ? arr[0] = tmp #第一個元素為初始最后一個元素的值
? ? ? ? k -= 1
?
if __name__ == "__main__":
? ? k = 4
? ? arr = ['a','b','c','d','1','2','3','4']
? ? rightShift(arr,k)
? ? i = 0
? ? while i < len(arr):
? ? ? ? print(arr[i],end="")
? ? ? ? i += 1
運行結果:
1234abcd
#方法二
def reverse(arr,start,end):
? ? while start<end:
? ? ? ? temp = arr[start]
? ? ? ? arr[start] = arr[end]
? ? ? ? arr[end] = temp
? ? ? ? start += 1
? ? ? ? end -= 1
?
def rightShift(arr,k):
? ? if arr == None:
? ? ? ? print("參數不合法!")
? ? ? ? return
? ? lens = len(arr)
? ? k %= lens
? ? reverse(arr,0,lens-k-1)
? ? reverse(arr,lens-k,lens-1)
? ? reverse(arr,0,lens-1)
?
if __name__ == "__main__":
? ? k = 4
? ? arr = ['a','b','c','d','1','2','3','4']
? ? rightShift(arr,k)
? ? i = 0
? ? while i < len(arr):
? ? ? ? print(arr[i],end="")
? ? ? ? i += 1
運行結果
1234abcd
性能分析
方法一每移動一次,其時間復雜度為O(N),故移動K次,總的時間復雜度為O(K*N),0<K<N,且時間復雜度不滿足O(N)。
方法二時間復雜度為O(N),完成翻轉操作只用了一個輔助存儲空間。
總結
原文鏈接:https://blog.csdn.net/scu_07_bingo/article/details/107608991
相關推薦
- 2022-05-10 bean屬性xml方式的自動裝配
- 2022-08-20 C++?基礎函數的介紹及使用(Vector+deque+STL)_C 語言
- 2022-07-23 SQL?Server刪除表中的重復數據_MsSql
- 2023-05-26 C++?static的作用解讀_C 語言
- 2022-12-31 Mobx實現React?應用的狀態管理詳解_React
- 2023-10-14 uniapp在Android 10對公共目錄的非媒體文件讀取上傳失敗問題
- 2022-07-23 Python實現單向鏈表_python
- 2022-08-19 Mac上Chrome瀏覽器快捷鍵匯總
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支