数组第二大唯一元素查找(无排序)Java代码逻辑问题排查
无排序实现数组第二大值查找的逻辑问题排查
我正在尝试实现数组中第二大数值的查找功能,希望能有人指出我现有代码遗漏了什么判断条件?
我清楚互联网上有很多该问题的现成解法,但我希望定位自己编写的无排序实现代码的逻辑缺陷(不使用排序方法),现有代码如下:
class Solution { int print2largest(int numbers[], int n) { if(n <= 1) return -1; int firstLargeNo = -1, secondLargeNo = -1; if(numbers[0] > numbers[1]) { firstLargeNo = numbers[0]; secondLargeNo = numbers[1]; } else { firstLargeNo = numbers[1]; secondLargeNo = numbers[0]; } for(int i = 2; i < numbers.length; i++) { if(numbers[i] > firstLargeNo) { secondLargeNo = firstLargeNo; firstLargeNo = numbers[i]; } else if(firstLargeNo == secondLargeNo || numbers[i] > secondLargeNo) secondLargeNo = numbers[i]; } if(firstLargeNo == secondLargeNo) return -1; return secondLargeNo; } }
失败测试用例对应的正确输出结果:999
核心逻辑缺陷
你的代码漏了等值场景的判断,这也是测试用例跑失败的根本原因:
遍历过程中更新第二大值时,没有排除当前遍历值等于最大值的情况。
举个复现例子:如果数组内容为[1000, 999, 1000],遍历到第三个元素1000时,它不大于已记录的最大值firstLargeNo(1000),但会触发numbers[i] > secondLargeNo的判断(1000>999成立),直接把secondLargeNo错误更新为1000,最后会误判最大值和第二大值相等返回-1,但实际正确第二大值就是999,和你给出的预期输出完全匹配。
除此之外还有两个潜在隐患:
- 初始值硬编码为-1存在兼容问题:如果数组中存在合法的-1元素,初始化逻辑会出现误判
- 初始化前两个元素时没有处理相等的边界,虽然大部分场景能被后续遍历逻辑覆盖,但遇到特殊等值数组时容易出问题
修正方案
只需要在更新第二大值的分支上,新增「当前值不等于最大值」的判断即可,修正后的遍历核心代码如下:
for(int i = 2; i < numbers.length; i++) { if(numbers[i] > firstLargeNo) { secondLargeNo = firstLargeNo; firstLargeNo = numbers[i]; } // 新增等值判断,过滤掉和最大值相等的元素 else if(numbers[i] != firstLargeNo && (firstLargeNo == secondLargeNo || numbers[i] > secondLargeNo)) { secondLargeNo = numbers[i]; } }
如果需要兼容数组含-1的场景,可以把两个最大值变量的初始值设为Integer.MIN_VALUE,最后判断如果第二大值仍为初始值再返回-1即可。
内容的提问来源于stack exchange,提问作者Aman Agarwal
相关产品推荐
相关产品推荐

