我應該編寫一個代碼,將數組的每個元素向左移動一個位置,并執行此操作 d 次。例如:如果數組是 [1,2,3,4,5] 并且 d 的值為 2,則應輸出以下內容: [3,4,5,1,2] (它隨著每次迭代而變化如下: [1,2,3,4,5]==>[2,3,4,5,1]==>[3,4,5,1,2]問題是在 10 個測試用例中的 2 個中,hackerrank 將我的代碼計算在內我讀到使用帶有 range() 函數的 for 循環比在 python 中使用 while 循環要快得多。所以我消除了所有的while循環,使代碼盡可能簡潔。但是,當數組中數字的大小和數量變得太大時,代碼仍然會超時。這是我的代碼(大數字失?。篸ef rotLeft(a, d): for i in range(0,d): a=a[1:]+a[:1] return aif __name__ == '__main__': fptr = open(os.environ['OUTPUT_PATH'], 'w') nd = input().split() n = int(nd[0]) d = int(nd[1]) a = list(map(int, input().rstrip().split())) result = rotLeft(a, d) fptr.write(' '.join(map(str, result))) fptr.write('\n') fptr.close()這段代碼是我在hackerrank上找到的一個解決方案(雖然我認為它是為python 2設計的,但這不重要):def array_left_rotation(a, n, k): return a[k:] + a[:k]n, k = map(int, raw_input().strip().split(' '))a = map(int, raw_input().strip().split(' '))answer = array_left_rotation(a, n, k);print ' '.join(map(str,answer))解決方案代碼通過所有測試輸入,但是當數字太大和太多時我的代碼失敗。
2 回答

溫溫醬
TA貢獻1752條經驗 獲得超4個贊
您在不必要的情況下使用for循環d會使解決方案的時間復雜度為O(nxd),其中n的長度是a. 您可以直接將列表切片d,并且考慮到d大于或等于 的長度的情況a,您可以使用 的d長度上的余數a,這樣解決方案的時間復雜度只需O(n):
def rotLeft(a, d):
offset = d % len(a)
return a[offset:] + a[:offset]

子衿沉夜
TA貢獻1828條經驗 獲得超3個贊
想想看,如果你需要移位["a","b","c","d"]
100001 次……結果是什么?
與移動它 1 次相同。為什么?因為 100000 可以被 4 整除(您的列表的長度) - 在 4 次移動之后,您的列表恢復到原來的狀態 - 所以如果完全移動 25k 次,您可以再次移動 - 或者簡單地計算“無意義”的移動并移動一次.
比在循環內執行輪班要快得多。
添加回答
舉報
0/150
提交
取消