2016-05-16 130 views
0

我在leetcode上練習Python編程。爲什麼這兩個幾乎相同的代碼有不同的高效(Python)?

所以這就是問題所在: https://leetcode.com/problems/reverse-vowels-of-a-string/

這就是我的回答:

def reverseVowels(s): 
    result = list(s) 
    v_str = 'aeiouAEIOU' 
    v_list = [item for item in s if item in v_str] 
    v_list.reverse() 
    v_index = 0 
    for i, item in enumerate(s): 
     if item in v_list: 
      result[i] = v_list[v_index] 
      v_index+=1 
    return ''.join(result) 

結果:Time Limit Exceeded

而且我發現在討論一個非常類似的答案:

def reverseVowels(s): 
    lst = list(s) 
    vowels_str = "aeiouAEIOU" 
    vowels_list = [item for item in lst if item in vowels_str] 
    vowels_list.reverse() 
    vowels_index = 0 
    for index, item in enumerate(lst): 
     if item in vowels_str: 
      lst[index] = vowels_list[vowels_index] 
      vowels_index += 1 
    return ''.join(lst) 

結果:Accepted

這太奇怪了。我認爲這兩個代碼看起來完全一樣。

它們的區別只不過是參數而已。

我很好奇爲什麼這些代碼導致不同的結果。

+1

這不是python代碼。你不能在'def'之外有'return'。請提供**完整**定義,包括參數列表。另外:嘗試多次運行代碼......代碼運行速度通常很快,只有50%的時間通過了時間限制。 – Bakuriu

+0

@Bakuriu對不起,我錯過了一些代碼。感謝您的提醒。我已經嘗試了很多次我的代碼。但它總是給我同樣的結果.. –

回答

3

有兩個代碼之間的兩個不同的線路。 第一個是:

  • 爲指數,產品在枚舉(LST):
  • 對於i,項目在枚舉(S):

在第一情況下,它遍歷列表和在第二個它遍歷字符串。這裏可能會有一些性能損失,但這不是主要問題。

  • 如果vowels_str項目:
  • 如果v_list項目:

這是運行時間的推移。在第一種情況下(工作代碼),它查找由元音組成的字符串中的字符,它具有不變的長度。 在第二種情況下,它會查找字符串中包含的所有元音列表中的字符,根據測試中給出的字符串,該字符可能很大。

+0

你是對的。我剛剛發現它哈哈。 –

1

在其中的第一個中,您直接迭代字符串(s)多次。第二,轉換爲列表後,您正在遍歷該列表(lst)。

這導致差異的確切原因是python解釋器中的一個(承認很大並且可能對正確性很重要)實現細節。

中查看討論相關的問題:Why is it slower to iterate over a small string than a small list?

相關問題