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,提问作者Никита Павлов
相关产品推荐
相关产品推荐

