如果存在异常值,您可以分析前三个并找到异常值。
如果有,你就完成了。如果没有,你知道期望的奇偶性,并可以相应地测试每个后续元素。
为奇/偶数创建列表,在原则上会导致结果,但不必要地浪费内存。
在代码中,这可能看起来像:
def find_outlier(seq):
par0 = seq[0] % 2
par1 = seq[1] % 2
if par0 != par1:
return seq[1] if seq[2] % 2 == par0 else seq[0]
for x in seq:
if x % 2 != par0:
return x
a = [2, 4, 6, 8, 10, 3]
b = [2, 4, 0, 100, 4, 11, 2602, 36]
c = [160, 3, 1719, 19, 11, 13, -21]
print(find_outlier(a))
print(find_outlier(b))
print(find_outlier(c))
你的代码以目前的形式无法正常工作:
for num in list_integers:
if num % 2 != 0:
odd = num
elif num % 2 == 0:
even = num
您将只在odd
中看到最后一个奇数,而在even
中看到最后一个偶数,没有任何关于有多少个数字的信息。 您需要计算有多少个偶数/奇数,并最终需要存储遇到的每个奇偶性的第一个值。
for num in list_integers:
if len([odd]) < len([even]):
return odd
else:
return even
代码总是检查长度为length-1的列表,并始终返回even
。
我没有看到简单的修复方式,可以使您的代码与上述解决方案具有可比较的效率。但是您可以调整您的代码以使其合理高效(时间复杂度为O(n)
,但不带短路功能;空间复杂度为O(1)
):
def find_outlier_2(seq):
odd = None
even = None
n_odd = n_even = 0
for x in seq:
if x % 2 == 0:
if even is None:
even = x
n_even += 1
else:
if odd is None:
odd = x
n_odd += 1
if n_even > 1:
return odd
else:
return even
上述方法比其他答案更有效,因为它不会创建不必要的列表。
例如,
这些 解决方案 在时间复杂度和空间复杂度上都消耗更多内存(时间复杂度为
O(n)
,空间复杂度也为
O(n)
):
def find_outlier_3(list_integers):
odd = []
even = []
for num in list_integers:
if num % 2 != 0:
odd.append(num)
elif num % 2 == 0:
even.append(num)
if len(odd) < len(even):
return odd[0]
else:
return even[0]
def find_outlier_4(lst):
odds = [el % 2 for el in lst]
if odds.count(0) == 1:
return lst[odds.index(0)]
else:
return lst[odds.index(1)]
简单的基准测试表明,这些解决方案的速度也更慢:
%timeit [find_outlier(x) for x in (a, b, c) * 100]
# 10000 loops, best of 3: 128 µs per loop
%timeit [find_outlier_2(x) for x in (a, b, c) * 100]
# 1000 loops, best of 3: 229 µs per loop
%timeit [find_outlier_3(x) for x in (a, b, c) * 100]
# 1000 loops, best of 3: 341 µs per loop
%timeit [find_outlier_4(x) for x in (a, b, c) * 100]
# 1000 loops, best of 3: 248 µs per loop
len([odd])
不可能返回除 1 以外的任何值 - 因为你明确地将一个只有一个元素的列表传递给了函数! - jasonharper