leetcode 面试题
共 38 道 leetcode 面试题。答案默认折叠,便于先自行作答。 1. 最大公共前缀 难度:2 · 类型:QA 编写一个函数,接收一个字符串数组作为输入,找出这些字符串的最大公共前缀。如果没有公共前缀,则返回空字符串。 输入输出要求: 输入:一个字符串数组。 输出:一个字符串,表示最大公共前缀。 示例: const input = ["flower", "flow", "flight"]; const result = longestCommonPrefix(input); console.log(result); // 输出:'fl' 题目要点 最大公共前缀问题的核心是逐步缩小候选前缀;横向扫描通过不断用后续字符串修剪前缀,实现简单且高效;在最坏情况下时间复杂度为 O(n·m),空间复杂度为 O(1),非常适合在实际工程和面试中使用。 参考答案 这个问题本质是在多个字符串之间求一个公共的、连续的前缀子串,并且要求尽可能长。关键不在于字符串操作技巧,而在于如何逐步收敛搜索空间。 一、整体思路说明(横向扫描) 横向扫描的核心思想是: 先假设第一个字符串是公共前缀,然后不断用后续字符串去“修剪”它。 执行过程可以概括为: 取第一个字符串作为初始前缀 从第二个字符串开始,逐个比较 如果当前字符串不以该前缀开头,就不断缩短前缀 一旦前缀缩短为空,说明不存在公共前缀,可以提前结束 这个过程的好处是逻辑直观,且在工程中可读性和可维护性都很好。 二、示例代码实现(横向扫描) function longestCommonPrefix(strs) { if (!strs || strs.length === 0) return ""; let prefix = strs[0]; for (let i = 1; i < strs.length; i++) { while (!strs[i].startsWith(prefix)) { prefix = prefix.slice(0, -1); if (prefix === "") return ""; } } return prefix; } 示例验证 const input = ["flower", "flow", "flight"]; console.log(longestCommonPrefix(input)); // "fl" 三、时间与空间复杂度分析 时间复杂度: 最坏情况下为 O(n * m) ...