Codewars题‘Find The Parity Outlier’字典实现测试失败求助
Codewars "Find The Parity Outlier" 解题错误分析与修复
问题背景
给定一个长度至少为3的整数数组,数组中除单个异常值N外,其余全为奇数或全为偶数,需返回该异常值N。我尝试用字典实现解题,但有4个测试用例未通过,测试错误结果如下:
- 预期结果为1,实际返回2
- 预期结果为17,实际返回36
- 预期结果为-123456789,实际返回36
- 预期结果为1,实际返回0
我的代码:
def find_outlier(integers): d = dict() count = 0 count1 = 0 for i in range(len(integers)): if integers[i] % 2 != 0 : d['odd'] = integers[i] else: d['even'] = integers[i] for j in range(len(integers)): if integers[j] % 2 == 0: count += 1 else: count1 += 1 if count > count1: return d['odd'] return d['even']
问题分析
你的代码存在两个核心问题:
- 字典赋值逻辑错误:字典
d中的odd和even键会被循环中的每一个对应数值覆盖,最终只保存数组最后一个奇数和最后一个偶数。如果异常值出现在数组前半段,字典中根本不会存储它,导致后续返回错误值。 - 统计与返回逻辑的缩进错误:第二个循环中,判断
count和count1的逻辑以及return语句被嵌套在else块内,意味着只要遇到第一个奇数,就会立刻终止循环并返回结果,完全没有完成整个数组的奇偶统计。比如当异常值是数组第一个元素(奇数)、后续全是偶数时,代码会直接返回最后一个偶数,而非正确的异常值。
解决方案
你不需要用字典来实现这个功能,以下两种方式可以高效解决问题:
修正代码1:基础统计版
def find_outlier(integers): count_even = 0 count_odd = 0 # 第一步:统计数组中偶数和奇数的数量 for num in integers: if num % 2 == 0: count_even += 1 else: count_odd += 1 # 第二步:根据数量判断异常值类型,遍历找到它 if count_even == 1: for num in integers: if num % 2 == 0: return num else: for num in integers: if num % 2 != 0: return num
修正代码2:简洁版(利用列表推导)
def find_outlier(integers): # 生成每个数的奇偶标识列表:1代表奇数,0代表偶数 parity = [n % 2 for n in integers] # 如果奇数只有1个,返回对应位置的数;否则返回唯一的偶数 if sum(parity) == 1: return integers[parity.index(1)] else: return integers[parity.index(0)]
内容的提问来源于stack exchange,提问作者CHim
相关产品推荐
相关产品推荐

