簡體   English   中英

在 Python 中旋轉陣列

[英]Rotate array in Python

Leetcode上有這個問題,189 Rotate array。 在此處輸入鏈接描述它的語句是“給定一個數組,將數組向右旋轉 k 步,其中 k 是非負數。” 為了更好地理解它,這里有一個例子。 在此處輸入圖像描述

所以,我的代碼是

for _ in range(k):
   j = nums[-1]
   nums.remove(nums[-1])
   nums.insert(0, j)

它不能通過其中的一些測試用例。 在討論面板中,我發現了一個聲稱它已成功提交的代碼,就像

for _ in  range(k):
   nums.insert(0, nums.pop(-1))

我想知道,這兩者之間有什么區別以及為什么我的代碼無法通過某些測試用例。

如果您在 python shell [].remove.__doc__上執行此操作,您將看到list.remove的目的是:

刪除第一次出現的值。 如果值不存在,則引發 ValueError。

在您的代碼nums.remove(nums[-1])不會刪除最后一項,而是第一次出現最后一項的值。

例如

如果您有一個值為nums = [2, 4, 8, 3, 4]的列表,並且如果您執行nums.remove(nums[-1]) ,則nums的內容變為[2, 8, 3, 4]而不是[2, 4, 8, 3]你所期待的。

只需使用切片:

>>> def rotate(l, n):
...     return l[-n:] + l[:-n]
...
>>> lst = [1, 2, 3, 4, 5, 6, 7]
>>> rotate(lst, 1)
[7, 1, 2, 3, 4, 5, 6]
>>> rotate(lst, 2)
[6, 7, 1, 2, 3, 4, 5]
>>> rotate(lst, 3)
[5, 6, 7, 1, 2, 3, 4]

cesarv給出的答案既好又簡單,但是在大型 arrays numpy 上肯定會表現更好。 考慮:

np.roll(lst, n)

在您的代碼中 j = nums[-1] 並且您正在嘗試插入(0,nums[-1])。

for _ in  range(k):
   nums.insert(0, nums.pop(-1))

插入其他數字 - (0, nums.pop(-1))

remove()方法將單個元素作為參數,並從列表中刪除它的第一次出現。

pop()方法采用單個參數(索引)。 傳遞給該方法的參數是可選的。 如果未傳遞,則默認索引 -1 作為參數(最后一項的索引)傳遞。

如果測試用例在最后一個索引之前有相同的項目,那么測試用例將失敗。

因此,要更正您的代碼,請用pop替換remove

for _ in range(k):
   poppedElement = nums.pop()
   nums.insert(0, poppedElement)

或者讓它更簡潔——

for _ in range(k):
   nums.insert(0, nums.pop())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM