修复LeetCode游戏弱角色统计代码中j重置失效的问题
《游戏中的弱角色数量》代码Bug修复
问题描述
给定二维整数数组properties,其中properties[i] = [attack_i, defense_i]代表第i个角色的攻击和防御属性。若存在另一个角色j的攻击和防御均严格大于角色i,则i为弱角色,返回弱角色总数。示例:输入[[5,5],[6,3],[3,6]],输出0。
原实现代码
public static int numberOfWeakCharacters(int[][] properties) { if (properties.length == 0) { return 0; } int counter = 0; for (int i =0; i<properties.length; i++) { for (int j = 0; j<properties.length; j++) { int localCounter = 0; int firstValue = properties[j][0]; int value = properties[j][1]; if ((properties[i][0] < firstValue && properties[i][1] < value) ) { counter++; if (i+1 == properties.length) { break; } i++; j=0; } } } return counter; }
Bug现象
当if条件触发时,j = 0;语句未生效,j并未从起始位置重新遍历,而i已自增进入下一个角色的判断。
Bug原因
手动修改外层循环变量i和内层循环变量j的迭代逻辑,破坏了for循环的原有执行流程:
- 内层for循环每次迭代结束后会自动执行
j++,所以即使在循环体里设置j=0,下一次迭代时j会变成1,无法从0开始重新遍历; - 手动执行
i++会导致外层循环的i被额外递增,可能跳过部分角色的判断。
修复后的代码
public static int numberOfWeakCharacters(int[][] properties) { if (properties.length == 0) { return 0; } int counter = 0; for (int i = 0; i < properties.length; i++) { boolean isWeak = false; for (int j = 0; j < properties.length; j++) { int attackJ = properties[j][0]; int defenseJ = properties[j][1]; // 找到任意一个j满足条件,即可判定i为弱角色 if (properties[i][0] < attackJ && properties[i][1] < defenseJ) { isWeak = true; break; // 跳出内层循环,无需继续检查其他j } } if (isWeak) { counter++; } } return counter; }
修复说明
- 新增
isWeak标记位,用于记录当前角色i是否为弱角色 - 当找到任意一个满足条件的j时,立即标记
isWeak为true并跳出内层循环,避免不必要的遍历 - 外层循环自然处理每个i,不再手动修改循环变量
i和j,保证循环流程的正确性 - 移除了无用的
localCounter变量,简化代码
内容的提问来源于stack exchange,提问作者LordArnur
相关产品推荐
相关产品推荐

