题目
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
首先看到这道题目我的思路是
- 如果 实参 数组长度 <= 1 不用比较 直接输出这个实参
- 用回调函数将数组里面每个字符串的同位置字符进行比较
- 找出数组里面 字符串 的 最小长度 循环到这里停止
- 用一个空数组把相同的字符装起来
- 数组 join 一下变成字符串
- 判断传进函数里的数组长度是否大于1,
if (strs.length <= 1) {
console.log(strs.join('')) //如果小于1, 我就直接把这个数组转换成字符串直接输出
return
}
- 开始使用回调函数了
- 传入i, j , 数组
- 用 map 遍历一下数组 找出数组里面字符串最短的长度
- 循环,比较每个字符串相同位置的字符是否相同 ( 以 ['flower', 'floor', 'flight', 'fly'] 数组为例 )
function cal (i, j, strs) {
const strLength = strs.map((ele) => ele.length)
const minLength = Math.min(...strLength)
if (j >= minLength) return
let temp = strs[i][j];
for (let k = 1; k < strs.length; k++) {
if (strs[k][j] !== temp) {
return
}
}
cal(i, j + 1, strs) // 回调函数
arr.push(temp)
}
第一次循环,将 flower 中的第一个字符 f 与 floor 的第一个字符 f 比较,发现它们相同,第二次循环,再将 floor 的第一个字符 f 和 flight 的第一个字符 f 比较, 发现它们相同,第三次循环...... (下图是回调过程)

循环完后, j+1, 意思是接着比较 各字符串里面的 第二个字符,调用回调函数,再接着比较 各字符串里面的 第n个字符 最后,得到的数组 arr
console.log(arr)
=> ['f', 'l']
判断数组是不是是空数组,如果是空数组,按照题目要求,输出'',否则,输出一个字符串
const arrLength = arr.length == 0 ? '' : arr.reverse().join('')
console.log(arrLength)
=> 'fl'
这样我就用回调函数得到了一个数组,并将这个数组转换成了字符串,完美的符合了题干要求,做完啦 : )
总结
4 + 3
四个步骤写完这个回调函数:
- 如果 实参 数组长度 <= 1 不用比较 直接输出这个实参
- 用回调函数将数组里面每个字符串的同位置字符进行比较
- 找出数组里面 字符串 的 最小长度 循环到这里停止
- 用一个空数组把相同的字符装起来
- 数组 join 一下变成字符串
三个方法完善这个回调函数,map、Math.min、...扩展运算符。
小白初体验回调函数,虚心接受更好的建议和反馈!谢谢~