Hackerrank Migratory Birds代码遇神秘边界用例失败求排查
解决Hackerrank Migratory Birds问题的代码错误分析
你的代码存在的核心问题是:当多个鸟类ID的出现次数同为最大值时,无法保证返回其中最小的ID。
问题原因
原代码在遍历统计字典时,仅在遇到次数大于当前最大值时更新结果。但当出现多个ID次数相等且都是最大值的情况时,原代码会保留第一个遍历到的ID,而字典的遍历顺序(尤其是Python 3.7之前的版本)是不确定的,无法保证这个ID是所有最大次数ID里最小的那个。比如测试用例[2,2,1,1,3],若字典先遍历到2,代码会返回2,但正确答案应该是1。
修正方案
方案1:遍历字典时增加相等次数的判断
在遍历统计结果时,当遇到次数等于当前最大值的ID,比较并保留更小的ID:
def migratoryBirds(arr): _dict = {} for key in arr: if key not in _dict: _dict[key] = 1 else: _dict[key] += 1 _max_key = None _max_cnt = 0 for key in _dict: current_cnt = _dict[key] if current_cnt > _max_cnt: _max_key = key _max_cnt = current_cnt elif current_cnt == _max_cnt: if key < _max_key: _max_key = key return _max_key
方案2:利用排序实现更简洁的逻辑
通过对统计结果排序,先按次数降序,次数相同则按ID升序,直接取第一个元素的ID:
def migratoryBirds(arr): count = {} for bird in arr: count[bird] = count.get(bird, 0) + 1 # 排序规则:优先按次数从高到低,其次按ID从小到大 sorted_birds = sorted(count.items(), key=lambda x: (-x[1], x[0])) return sorted_birds[0][0]
方案3:使用collections.Counter简化统计
借助Python内置的Counter工具类,可以更简洁地完成统计和排序:
from collections import Counter def migratoryBirds(arr): count = Counter(arr) # 按次数降序、ID升序排序后取第一个元素 return sorted(count, key=lambda x: (-count[x], x))[0]
内容的提问来源于stack exchange,提问作者CaTx
相关产品推荐
相关产品推荐

