LeetCode题目Check If N == M*2代码未通过测试,求错误原因解析
代码错误分析:LeetCode「检查数组是否存在元素及其两倍值」问题
我刚开始在LeetCode上刷题,做「Check If N and Its Double Exist」(即检查数组中是否存在某个元素是另一个元素的两倍)这道题时,测试用例未通过,以下是我编写的代码:
function checkIfExist($arr) { $i = 0; $j = 0; $n = count($arr); // loop over the array for($i; $i < $n; $i++) { for($j; $j < $n; $j++) { // check if element of i and j not the same and N*2 = M if ($i != $j && $arr[$i] * 2 == $arr[$j]) { return true; } } } return false; }
代码中的错误点
1. 内层循环变量未重置
你把$j的初始化放在了外层循环之外,导致只有第一次外层循环($i=0)时,$j会从0完整遍历到数组末尾。当外层循环进入$i=1及之后的迭代时,$j已经等于数组长度$n,内层循环的条件$j < $n不成立,直接跳过循环。这会导致除了第一个元素之外,其他元素都没有和数组中所有元素进行比较,漏掉大量应该检测的情况。
比如测试用例[10,2,5,3],正确结果应该是true(10是5的两倍),但你的代码中$i=0时会检查到10*2≠2、10*2≠5、10*2≠3,然后$j变成4;当$i=1时,$j=4不满足j<4,内层循环不执行,最终返回false,导致错误。
2. 逻辑覆盖不完整
题目要求的是存在两个不同索引i和j,使得arr[i]是arr[j]的两倍,或者arr[j]是arr[i]的两倍。你的代码只检查了arr[i] * 2 == arr[j],也就是只判断当前元素的两倍是否存在于数组中,但反过来,如果当前元素是另一个元素的两倍(比如数组[4,2]),你的代码无法检测到:当$i=0时,4*2=8≠2;$i=1时内层循环已失效,最终返回false,但正确结果应为true。
修复建议
- 把内层循环的
$j初始化放到外层循环内部,每次外层循环开始时重置$j=0; - 补充双向判断,改为检查
$arr[$i] == 2 * $arr[$j] || $arr[$j] == 2 * $arr[$i]; - 也可以用哈希表优化:遍历数组时记录已出现的元素,同时检查当前元素的两倍或一半是否已存在,这样时间复杂度可以从O(n²)降到O(n)。
内容的提问来源于stack exchange,提问作者Mohcin Bounouara
相关产品推荐
相关产品推荐

