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

PHP实现Codewars kata 'are they the same'提交报错问题排查求助

代码问题排查

核心错误点

  • 未校验元素出现频次:当前代码不会标记已匹配过的$a1元素,当$b中某平方值的出现次数多于$a1中对应底数的出现次数时,会错误返回true。例如$a1 = [2],$b = [4,4],你的代码会两次匹配到同一个2,错误返回true,实际应返回false。
  • 缺少数组长度校验:两个数组长度不一致时必然不满足条件,应直接返回false,你的代码无此判断,会直接触发上述频次匹配错误。
  • 空值判断逻辑冗余冲突:if(empty($a1) && empty($a2)) return true;之后的if(!$a1 && !$a2) return false;逻辑完全冲突,空数组场景下前一个判断已经返回结果,后一行代码永远不会执行,属于无效代码。
  • 计算逻辑冗余:$num2 < 0的判断放在内层循环中,每次遍历$a1元素都会重复执行,可移至外层循环减少不必要计算。

修复后代码

function comp($a1, $a2) {
    // 空值/空类型校验
    if (!isset($a1) || !isset($a2) || is_null($a1) || is_null($a2)) {
        return false;
    }
    // 长度不一致直接返回false
    if (count($a1) !== count($a2)) {
        return false;
    }
    // 双空数组直接返回true
    if (empty($a1)) {
        return true;
    }
    // 复制a1用于匹配后移除元素,不修改原数组
    $tempA = array_values($a1);
    foreach ($a2 as $num2) {
        // b中存在负数直接返回false
        if ($num2 < 0) {
            return false;
        }
        $matched = false;
        foreach ($tempA as $key => $num1) {
            if ($num2 === $num1 * $num1) {
                $matched = true;
                // 移除已匹配元素,避免重复匹配
                array_splice($tempA, $key, 1);
                break;
            }
        }
        if (!$matched) {
            return false;
        }
    }
    return true;
}

内容的提问来源于stack exchange,提问作者Никита Павлов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:45:03