亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我在數組中切換元素的代碼不夠快?

為什么我在數組中切換元素的代碼不夠快?

慕絲7291255 2022-03-09 20:39:30
我應該編寫一個代碼,將數組的每個元素向左移動一個位置,并執行此操作 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循環,使代碼盡可能簡潔。但是,當數組中數字的大小和數量變得太大時,代碼仍然會超時。這是我的代碼(大數字失敗):def 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 回答

?
繁星coding

TA貢獻1797條經驗 獲得超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]


查看完整回答
反對 回復 2022-03-09
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

想想看,如果你需要移位["a","b","c","d"]100001 次……結果是什么?

與移動它 1 次相同。為什么?因為 100000 可以被 4 整除(您的列表的長度) - 在 4 次移動之后,您的列表恢復到原來的狀態 - 所以如果完全移動 25k 次,您可以再次移動 - 或者簡單地計算“無意義”的移動并移動一次.

比在循環內執行輪班要快得多。


查看完整回答
反對 回復 2022-03-09
  • 2 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號