求助:调试Survive the Attack(7 kyu)数组比较算法代码
算法题调试求助
给定两个数组,数组元素代表士兵战力,判断防守方是否存活(返回True),否则返回False。规则如下:
- 双方同索引士兵互相攻击,战力高的存活;
- 战力相等时双方士兵都阵亡;
- 数组长度不同时,超出部分的士兵直接存活;
- 防守方存活条件:存活人数多于进攻方;
- 若双方存活人数相同,初始总战力高的一方获胜;总战力相同则返回
True(防守方存活);
初始总战力为数组所有元素之和。
我写了下面的代码,但只通过了约半数测试用例,找不到错误原因:
def is_defended(attackers, defenders): survivors_a = 0 survivors_b = 0 if attackers < defenders: survivors_b+=1 if attackers > defenders: survivors_a+=1 if attackers == defenders: survivors_a+=0 survivors_b+=0 if survivors_a == survivors_b and sum(attackers) > sum(defenders): return False if survivors_a == survivors_b and sum(attackers) < sum(defenders): return True if survivors_a == survivors_b and sum(attackers) == sum(defenders): return True elif survivors_a > survivors_b: return False elif survivors_a < survivors_b: return True
代码错误分析
- 未遍历处理同索引对战:你直接拿整个数组做比较,数组间的比较是按元素逐个对比至第一个不同项,完全不符合题目中每个同索引士兵单独对战的规则,这是核心错误。
- 忽略数组长度差异的处理:题目要求超出长度的士兵直接存活,但代码完全没计算这部分的存活人数。
- 条件分支逻辑混乱:多个
if和elif的组合存在冗余,且当存活人数不等时的判断逻辑容易触发异常分支。
修正后的代码
def is_defended(attackers, defenders): survivors_a = 0 survivors_b = 0 min_length = min(len(attackers), len(defenders)) # 处理同索引士兵对战 for a_power, d_power in zip(attackers, defenders): if a_power > d_power: survivors_a += 1 elif d_power > a_power: survivors_b += 1 # 战力相等时双方都阵亡,无需处理 # 计算超出长度的存活士兵 survivors_a += len(attackers) - min_length survivors_b += len(defenders) - min_length # 判断最终结果 if survivors_b > survivors_a: return True elif survivors_b < survivors_a: return False else: # 存活人数相同,比较初始总战力 total_attack = sum(attackers) total_defend = sum(defenders) if total_defend > total_attack: return True elif total_defend < total_attack: return False else: # 总战力相同,防守方存活 return True
内容的提问来源于stack exchange,提问作者salmon_fish
相关产品推荐
相关产品推荐

