Python实现wrong_position函数遇测试用例失败求修复
问题分析与修复方案
你的代码存在几个关键逻辑错误,导致测试用例失败,下面逐一说明并给出修复后的实现:
原代码的核心问题
- 错误的开头判断:
if guess.count(guess[0]) == len(guess): return 0完全不合理,比如当guess是[2,2,2,2]而code是[2,1,1,1]时,应该返回3,但这个判断会直接返回0。 - 重复元素的索引处理错误:使用
copy_guess.index(c)只会返回当前元素第一次出现的索引,当guess中有重复数字时,会错误地用同一个索引去匹配code,导致计数混乱。 - 未先排除位置正确的匹配:代码直接检查数字是否存在于code中,但没有先剔除那些位置已经正确的元素,导致把位置正确的数字错误计入位置错误的计数,或者错误消耗code中的元素。
修复后的实现
正确的思路是:先算出数字和位置都正确的数量,再算出两个列表中数字的总匹配数(不管位置),用总匹配数减去完全正确的数量,就是数字正确但位置错误的数量。
def wrong_position(guess, code): # 计算完全匹配(数字和位置都对)的数量 exact_matches = sum(g == c for g, c in zip(guess, code)) # 统计guess中各数字的出现次数 guess_counts = {} for num in guess: guess_counts[num] = guess_counts.get(num, 0) + 1 # 统计code中各数字的出现次数 code_counts = {} for num in code: code_counts[num] = code_counts.get(num, 0) + 1 # 计算总数字匹配数(取每个数字在两个列表中出现次数的最小值求和) total_matches = 0 for num in guess_counts: if num in code_counts: total_matches += min(guess_counts[num], code_counts[num]) # 位置错误的数量 = 总数字匹配数 - 完全匹配数 return total_matches - exact_matches
测试用例验证
用你给出的测试用例验证结果:
- 测试用例12:code=[2,3,3,2],guess=[1,1,1,2]
完全匹配数是1(最后一位2),总数字匹配数是1(仅一个2),1-1=0,符合预期。 - 测试用例13:code=[2,3,3,2],guess=[1,1,3,2]
完全匹配数是2(第三位3、第四位2),总数字匹配数是2(一个3、一个2),2-2=0,符合预期。 - 测试用例17:code=[9,9,9,3],guess=[3,9,9,2]
完全匹配数是2(第二位、第三位的9),总数字匹配数是3(两个9、一个3),3-2=1,符合预期。 - 测试用例20:code=[3,5,4,4],guess=[1,4,2,4]
完全匹配数是1(第四位的4),总数字匹配数是2(两个4),2-1=1,符合预期。
简化实现(可选)
如果允许使用标准库,可以用collections.defaultdict简化计数逻辑:
from collections import defaultdict def wrong_position(guess, code): exact_matches = sum(g == c for g, c in zip(guess, code)) guess_counts = defaultdict(int) code_counts = defaultdict(int) for num in guess: guess_counts[num] += 1 for num in code: code_counts[num] += 1 total_matches = sum(min(guess_counts[num], code_counts[num]) for num in guess_counts if num in code_counts) return total_matches - exact_matches
内容的提问来源于stack exchange,提问作者rizwan rasheed
相关产品推荐
相关产品推荐

