我在leetcode上练习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
这太奇怪了。我认为这两个代码看起来完全一样。你知道吗
它们的区别只是参数。你知道吗
我很好奇为什么这些代码会导致不同的结果。你知道吗
在第一个例子中,您直接对字符串(
s
)进行多次迭代。在第二种情况下,在转换为列表之后,您将迭代该列表(lst
)。你知道吗造成这种差异的确切原因是python解释器中的一个实现细节(当然,对于正确性来说是非常重要的)。你知道吗
更多讨论请参见相关问题:Why is it slower to iterate over a small string than a small list?
两个代码之间有两行不同的代码。 第一个是:
在第一种情况下,它遍历列表,在第二种情况下,它遍历字符串。这里可能会有一些性能损失,但这不是主要问题。你知道吗
这就是跑步时间的方向。在第一种情况下(工作代码),它在元音组成的字符串中查找长度恒定的字符。 在第二种情况下,它在字符串中包含的所有元音的列表中查找字符,根据测试中给定的字符串,这个字符可能很大。你知道吗
相关问题 更多 >
编程相关推荐