LeetCode最长公共前缀问题:$temp_var无法接收方法返回值
解决LeetCode「最长公共前缀」PHP代码的返回值问题
问题情况
我是编程新手,在LeetCode做「最长公共前缀」题时遇到问题:测试输入strs = ["flower","flow","flight"],预期输出是"fl",但代码输出"flight"。排查发现$temp_var无法正确接收reduceOneAndCheck方法的返回值,第二次循环对比"flower"和"flow"时,$temp_var没被赋值为"flow"反而变成空值,后续被赋值为"flight"返回。
错误分析
- 递归返回值丢失:
reduceOneAndCheck方法的else分支中,递归调用$this->reduceOneAndCheck($str_tmp, $value)后没有返回该结果,导致递归的最终返回值无法传递到上层调用,方法默认返回null,这就是$temp_var变为空值的核心原因。 - 冗余的引用传递:
reduceOneAndCheck的第一个参数使用了引用&$temp_var,但逻辑中并未修改原变量,反而容易造成变量状态混淆,完全没有必要。 - 变量未显式初始化:
$temp_var初始未赋值,虽然PHP会默认设为null,但显式初始化能避免潜在的未定义变量问题。
修正后的代码
class Solution { /** * @param String[] $strs * @return String */ function longestCommonPrefix($strs) { // 显式初始化临时变量 $temp_var = null; foreach ($strs as $value) { if($temp_var === null || $temp_var === "") { $temp_var = $value; } $temp_var = $this->reduceOneAndCheck($temp_var, $value); // 提前终止循环:公共前缀为空时无需继续对比 if ($temp_var === "") { break; } } return $temp_var; } function reduceOneAndCheck(string $temp_var, string $value) { // 处理空字符串边界情况 if($temp_var === "" || $value === "") { return ""; } if($temp_var === $value) { return $temp_var; } else { $str_tmp = substr($temp_var, 0, -1); // 递归调用必须返回结果,确保值能传递到上层 return $this->reduceOneAndCheck($str_tmp, $value); } } }
修正说明
- 修复递归返回逻辑:在else分支的递归调用前添加
return,让递归的结果能正确传递回上层调用,确保$temp_var能拿到正确的公共前缀。 - 移除冗余引用:将
&$temp_var改为普通参数$temp_var,避免不必要的变量引用干扰。 - 显式初始化变量:
$temp_var = null让代码逻辑更清晰,符合PHP编码规范。 - 添加提前终止:当
$temp_var变为空字符串时,直接跳出循环,减少不必要的计算,提升代码效率。
内容的提问来源于stack exchange,提问作者briso
相关产品推荐
相关产品推荐

