编写最长公共前缀函数时无法获取JavaScript数组第二个元素
问题分析与修复
你的代码存在几个关键问题:
- 循环越界导致
secondWord获取失败:原循环for (var i = 0; i < strs.length; i++)会让i遍历到数组最后一个元素,此时strs[1+i]超出数组索引范围变成undefined,自然拿不到目标元素。而且你本意是两两对比相邻字符串,循环应该只执行到strs.length - 1。 - 逻辑不符合需求:用
indexOf判断字符是否存在完全搞错了“最长公共前缀”的定义——公共前缀是从开头开始的连续相同字符,不是任意位置存在相同字符;一旦发现不匹配就清空word的逻辑也不对,应该停止当前字符的对比。 - 变量未定义报错:else分支里使用了
store1,但这个变量仅在if分支的循环内定义,运行时会抛出未定义错误。
修复后的代码:
var longestCommonPrefix = function(strs) { // 处理空数组的边界情况 if (strs.length === 0) return ""; // 以第一个字符串作为初始基准前缀 let prefix = strs[0]; // 和数组中每个后续字符串逐一对比 for (let i = 1; i < strs.length; i++) { // 循环缩短前缀,直到当前字符串以该前缀开头 while (strs[i].indexOf(prefix) !== 0) { prefix = prefix.slice(0, prefix.length - 1); // 如果前缀被删空,直接返回空字符串 if (prefix === "") return ""; } } return prefix; };
测试验证
用你提供的测试数组strs = ["flower", "flow", "character"]:
- 先以"flower"为前缀和"flow"对比,因"flow"开头不是"flower",前缀逐步缩短为"flow",此时匹配成功。
- 再用"flow"和"character"对比,发现无匹配开头,前缀不断缩短直至为空,最终返回"",符合三个字符串无公共前缀的预期。
内容的提问来源于stack exchange,提问作者Erol Armstrong
相关产品推荐
相关产品推荐

