2 回答

TA貢獻1836條經驗 獲得超4個贊
如果您只尋找要反轉的單個子字符串,則可以使用 zip() 進行連續的值對比較。首先確定第一個遞減對的位置。然后從該點開始找到第一個增加的對的位置。如果您有一個有效范圍,請反轉子字符串并測試列表是否有序。
a = [1,2,3,4,8,7,6,9]
start = next( (i for i,(v0,v1) in enumerate(zip(a,a[1:])) if v0>v1),len(a))
end = next( (i+start+1 for i,(v0,v1) in enumerate(zip(a[start:],a[start+1:])) if v0<v1),len(a))
if end > start : a[start:end] = a[start:end][::-1]
canSort = end > start+1 and not any( a>b for a,b in zip(a,a[1:])) # True
這將在 O(n) 時間內處理,而不是嵌套循環的 O(n^2)。
如果要檢查多個子字符串反轉,則需要將其變為循環。

TA貢獻1835條經驗 獲得超7個贊
你可以做這樣的事情......假設連續數字是指相差一個單位的數字。您還可以更改腳本以以相反的順序容納數字,但不是精確的順序 (8 7 6) 與 (9 6 4)
v=[1,2,3,4,8,7,6,9]
l = []
last_item =-99
for i in range(1,len(v)-1):
if v[i] == v[i + 1] + 1:
l.append(v[i])
last_item = v[i]
elif v[i] == last_item - 1:
l.append(v[i])
last_item = v[i]
print(sorted(l))
添加回答
舉報