LeetCode#14最长公共前缀相同测试用例提交结果错误排查
LeetCode 14. 最长公共前缀 提交结果异常
复现表现
- 官方给出的两个示例运行结果均符合预期:
- 示例1
- 输入:
strs = ["flower","flow","flight"] - 输出:
"fl"
- 输入:
- 示例2
- 输入:
strs = ["dog","racecar","car"] - 输出:
"" - 解释:输入的字符串之间不存在公共前缀
- 输入:
- 示例1
- 异常表现:提交代码时,测试用例
["ab", "a"]被判定输出为空字符串,与预期输出"a"不符;但在LeetCode平台单独自定义运行该测试用例、本地VSCode环境运行代码时,均能得到正确结果。
问题代码
var flag = false; var longestCommonPrefix = function(strs) { if(strs.length==1) return strs[0]; strs.sort(function(a,b){ return a.length - b.length; }); var str = "" for(var i=0; i<strs[0].length; i++){ for(var j=0; j<strs.length; j++){ if(strs[0][i] != strs[j][i]){ flag = true; break; } } if(flag) break; str += strs[0][i]; } return str; }; console.log(longestCommonPrefix(["ab", "a"]));
问题原因
flag变量被声明在函数外部的全局作用域,LeetCode提交判题时会在同一个JavaScript上下文中按顺序执行所有测试用例,不会为每个用例重置全局变量:
- 当执行到存在字符不匹配的测试用例时,全局
flag会被设置为true - 后续执行
["ab", "a"]用例时,flag初始值已经是true,进入第一层循环后会直接触发break逻辑,不会拼接公共前缀,最终返回空字符串 - 单独运行单个测试用例时,上下文是全新初始化的,
flag初始值为默认的false,因此能得到正确结果
修复方案
将flag变量的声明移动到函数内部,保证每次调用函数时flag都会被初始化为false,修复后代码如下:
var longestCommonPrefix = function(strs) { if(strs.length==1) return strs[0]; strs.sort(function(a,b){ return a.length - b.length; }); var str = "" for(var i=0; i<strs[0].length; i++){ var flag = false; for(var j=0; j<strs.length; j++){ if(strs[0][i] != strs[j][i]){ flag = true; break; } } if(flag) break; str += strs[0][i]; } return str; };
内容的提问来源于stack exchange,提问作者yunika
相关产品推荐
相关产品推荐

