本文目录导读:
Python算法面试是技术面试中的核心环节,主要考察候选人的数据结构、算法思维、代码实现能力以及问题拆解能力。
以下是根据不同难度级别和考察频率整理的经典Python算法面试案例,每个案例都包含了典型题目、考察点以及解题思路。
基础数据结构类(必考,通常用于第一轮)
考察对Python内置数据结构的熟悉程度。
两数之和 (Two Sum)
- 题目: 给定一个整数数组
nums和一个整数目标值target,请在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。 - 考察点: 哈希表(字典)的使用、空间换时间思想。
- 解法:
def two_sum(nums, target): hash_map = {} for i, num in enumerate(nums): complement = target - num if complement in hash_map: return [hash_map[complement], i] hash_map[num] = i return []
有效的括号 (Valid Parentheses)
- 题目: 给定一个只包括 , , , , , 的字符串 s ,判断字符串是否有效(左右括号必须按正确顺序闭合)。
- 考察点: 栈(Stack)的应用。
- 解法:
def is_valid(s): stack = [] mapping = {')': '(', '}': '{', ']': '['} for char in s: if char in mapping: # 如果是右括号,检查栈顶 top = stack.pop() if stack else '#' if mapping[char] != top: return False else: # 如果是左括号,入栈 stack.append(char) return not stack
合并两个有序链表 (Merge Two Sorted Lists)
- 题目: 将两个升序链表合并为一个新的升序链表并返回。
- 考察点: 链表操作、递归/迭代。
- 解法(递归):
def merge_two_lists(l1, l2): if not l1: return l2 if not l2: return l1 if l1.val < l2.val: l1.next = merge_two_lists(l1.next, l2) return l1 else: l2.next = merge_two_lists(l1, l2.next) return l2
高频算法思想类(核心面试题)
无重复字符的最长子串 (Sliding Window)
- 题目: 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
- 考察点: 滑动窗口、双指针、哈希集合。
- 解法:
def length_of_longest_substring(s): char_set = set() left = 0 max_len = 0 for right in range(len(s)): while s[right] in char_set: char_set.remove(s[left]) left += 1 char_set.add(s[right]) max_len = max(max_len, right - left + 1) return max_len
二叉树的层序遍历 (Tree BFS)
- 题目: 给你二叉树的根节点
root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。 - 考察点: 广度优先搜索(BFS)、队列。
- 解法:
from collections import deque def level_order(root): if not root: return [] result = [] queue = deque([root]) while queue: level_vals = [] for _ in range(len(queue)): node = queue.popleft() level_vals.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(level_vals) return result
岛屿数量 (Number of Islands)
- 题目: 给你一个由
1(陆地)和0(水)组成的二维网格,请你计算网格中岛屿的数量。(岛屿总是被水包围,并且每座岛屿只能由水平方向和垂直方向上相邻的陆地连接形成)。 - 考察点: 深度优先搜索(DFS)、图论、矩阵遍历。
- 解法:
def num_islands(grid): if not grid: return 0 rows, cols = len(grid), len(grid[0]) count = 0 def dfs(r, c): if r < 0 or c < 0 or r >= rows or c >= cols or grid[r][c] == '0': return grid[r][c] = '0' # 标记为已访问 dfs(r-1, c) dfs(r+1, c) dfs(r, c-1) dfs(r, c+1) for r in range(rows): for c in range(cols): if grid[r][c] == '1': count += 1 dfs(r, c) return count
经典算法与动态规划(中高难度)
反转链表 (Reverse Linked List)
- 题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
- 考察点: 链表指针操作、迭代与递归。
- 解法(迭代):
def reverse_list(head): prev = None curr = head while curr: next_temp = curr.next curr.next = prev prev = curr curr = next_temp return prev
爬楼梯 (Climbing Stairs) - 动态规划
- 题目: 假设你正在爬楼梯,需要 n 阶你才能到达楼顶,每次你可以爬 1 或 2 个台阶,你有多少种不同的方法可以爬到楼顶呢?
- 考察点: 斐波那契数列、动态规划、状态转移方程。
- 解法:
def climb_stairs(n): if n <= 2: return n dp1, dp2 = 1, 2 for i in range(3, n+1): dp1, dp2 = dp2, dp1 + dp2 return dp2
买卖股票的最佳时机 (Best Time to Buy and Sell Stock)
- 题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格,你只能选择某一天买入,并在未来的某一天卖出,设计一个算法来计算你所能获取的最大利润。
- 考察点: 一次遍历、贪心思想。
- 解法:
def max_profit(prices): min_price = float('inf') max_profit = 0 for price in prices: if price < min_price: min_price = price elif price - min_price > max_profit: max_profit = price - min_price return max_profit
系统设计 / 复杂应用类(高级面试)
设计一个 LRU 缓存机制 (Least Recently Used Cache)
- 题目: 设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。
- 考察点: 哈希表 + 双向链表(Python中可使用
OrderedDict),数据结构设计能力。 - 解法(OrderedDict实现):
from collections import OrderedDict class LRUCache: def __init__(self, capacity): self.capacity = capacity self.cache = OrderedDict() def get(self, key): if key not in self.cache: return -1 self.cache.move_to_end(key) # 将访问的key移到末尾(表示最近使用) return self.cache[key] def put(self, key, value): if key in self.cache: self.cache.move_to_end(key) self.cache[key] = value if len(self.cache) > self.capacity: self.cache.popitem(last=False) # 弹出最久未使用的(队首)
全排列 (Permutations)
- 题目: 给定一个不含重复数字的数组 nums ,返回其所有可能的全排列。
- 考察点: 回溯算法 (Backtracking)。
- 解法:
def permute(nums): result = [] def backtrack(path, remaining): if not remaining: result.append(path[:]) return for i in range(len(remaining)): backtrack(path + [remaining[i]], remaining[:i] + remaining[i+1:]) backtrack([], nums) return result
面试中的特殊技巧
- 大数/溢出处理:Python的整数是无限精度的(理论上),但面试官可能会问如果数字非常大,导致加法的性能问题,如何优化。
- 字符串处理:反转字符串、回文判断、字符串压缩(
"aabcccccaaa"->"a2b1c5a3")。 - 排序变形:快速排序的 partition 思想(用于查找第K大的数)。
- 进制转换与位运算:计算二进制中1的个数、判断IP地址合法性。
总结建议
- 刷题渠道:LeetCode(Top 100 高频题)、牛客网(国内互联网公司题库)。
- 面试策略:
- 先和面试官确认题目边界(输入是否为空?是否有负数?是否有序?)。
- 先给出暴力解法,再优化。
- 写代码时注意变量命名规范(不要用
a, b, c,用left, right, current_node)。 - Python特有优势:善用
set,dict,deque,heapq,lambda,sorted()的key参数。
标签: Python算法面试案例