2016-05-16 126 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?

相关问题