You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:12:41