我在leetcode上用Python练习编程。
所以这就是问题所在: https://leetcode.com/problems/reverse-vowels-of-a-string/
这是我的答案:
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
结果:SELECT *
FROM RestaurantOffer
WHERE Getdate() Between
cast(FromDate as datetime) + cast(FromTime as datetime)
and cast(ToDate as datetime)+cast(ToTime as datetime)
这太奇怪了。我认为这两个代码看起来完全一样。
它们的不同之处仅仅是参数。
我很好奇为什么这些代码会导致不同的结果。
答案 0 :(得分:3)
两个代码之间有两条不同的行。 第一个是:
在第一种情况下,它遍历列表,在第二种情况下,它遍历字符串。这里可能会有一些性能损失,但这不是主要问题。
这是运行时间的地方。在第一种情况下(工作代码),它查找由元音组成的字符串中的字符,该字符具有恒定的长度。 在第二种情况下,它会查找字符串中包含的所有元音列表中的字符,这可能很大,具体取决于测试中给出的字符串。
答案 1 :(得分:1)
在第一个中,您将多次直接迭代字符串(s
)。在第二个,转换为列表后,您将迭代该列表(lst
)。
这导致差异的确切原因是python解释器中的实现细节(通常很大且可能对正确性很重要)。
有关更多讨论,请参阅相关问题:Why is it slower to iterate over a small string than a small list?