Python 算法快速复习手册(长期没用、有基础、极速捡回、纯刷题向) | 一、Python 算法面试万能模板【直接背诵、白板默写】 |
一、必写开头 & 基础规则
1. 无需头文件
Python 不用include,直接写代码。
2. 缩进是语法(最容易忘)
- 不用大括号
{} if / for / while / 函数后面加冒号:- 下方代码缩进 4 个空格
python
运行
if a > 0: print("正数") # 缩进必须对齐二、输入输出(算法第一重点)
1. 单行输入
python
运行
# 读单个整数 n = int(input()) # 读单个字符串 s = input() # 读多个整数(一行多个数字) a, b = map(int, input().split())2. 读取一行数组 / 列表(刷题最高频)
python
运行
# 输入:1 2 3 4 5 nums = list(map(int, input().split()))3. 标准输出
python
运行
print(123) print("结果:", res) # 不换行输出 print(x, end="")三、基础数据类型
python
运行
# 整数 a = 10 # 小数 b = 3.14 # 字符串 s = "hello" # 布尔 flag = True超大整数自动支持,不用考虑溢出,秒杀 C/C++。
四、三大结构:分支 + 循环(算法核心)
1. 条件判断 if-elif-else
python
运行
x = 10 if x > 0: print("大于0") elif x == 0: print("等于0") else: print("小于0")注意:
- 判断相等:
== - 不等于:
!= - 并且:
and - 或者:
or
2. for 循环(遍历首选)
python
运行
# 1~n 遍历 for i in range(1, n+1): print(i) # 遍历列表 for num in nums: print(num) # 带下标遍历 for i in range(len(nums)): print(nums[i])3. while 循环
python
运行
i = 0 while i < 10: i += 1关键字
python
运行
break # 跳出循环 continue # 跳过本次五、列表 list(算法万能容器,重点掌握)
相当于「动态数组」,栈、队列、数组全靠它
python
运行
# 1. 创建 arr = [1,2,3,4] # 2. 增 arr.append(5) # 末尾加元素 arr.insert(0, 99) # 指定位置插入 # 3. 删 arr.pop() # 删除末尾 arr.pop(0) # 删除下标元素 arr.remove(3) # 删除指定值 # 4. 查 len(arr) # 长度 arr[0] # 取第一个 arr[-1] # 取最后一个 # 5. 常用操作 arr.sort() # 升序排序 arr.reverse() # 反转六、字符串 str(数据工程师必考)
python
运行
s = "abcde" len(s) # 字符串长度 s[0] # 取单个字符 s.strip() # 去除首尾空格 s.split(",") # 按逗号分割 → 列表 s.replace("a","b") # 替换字符串不可修改,如需改动:转列表list(s)
七、字典 dict / 集合 set(哈希、去重、计数)
1. 集合 set 去重
python
运行
nums = [1,2,2,3,3,3] res = list(set(nums)) # 快速去重2. 字典 dict 键值映射
python
运行
d = {} d["name"] = "张三" # 存数据 print(d["name"]) # 取数据八、函数写法(封装代码、简化逻辑)
python
运行
def add(x, y): return x + y # 调用 res = add(3, 5)- 无返回值可以不写
return - 无需声明变量类型
九、算法高频极简模板(直接默写)
1. 求和
python
运行
nums = list(map(int, input().split())) total = 0 for n in nums: total += n print(total)2. 找最大值
python
运行
max_val = nums[0] for n in nums: if n > max_val: max_val = n3. 交换两个数
python
运行
a, b = b, a4. 列表切片(超好用)
python
运行
arr[1:3] # 下标1~2 arr[:3] # 前3个 arr[::-1] # 反转列表十、你长期不用 Python,最容易犯的错误
- 忘记
if/for/while后面加冒号: - 缩进混乱,代码块错位直接报错
input()读数字忘记套int()- 混淆:
=赋值 、==判断 - range 左闭右开:
range(1,5)只包含 1,2,3,4
十一、1 小时快速找回手感(你现在直接照做)
- 手写 3 组:
input读入数组、单个数字 - 手写 for 循环遍历列表、求和、找最值
- 练习字符串分割、切片
- 写一道简单模拟题(比如:奇数求和、大小写转换)
一、Python 算法面试万能模板【直接背诵、白板默写】
1. 哈希表(dict /set)模板
1)普通字典 计数 / 映射
python
运行
# 初始化哈希 hash_map = dict() # 存值 hash_map[key] = value # 取值,不存在给默认值 val = hash_map.get(key, 0) # 遍历字典 for k, v in hash_map.items(): pass2)集合去重 / 判断存在
python
运行
s = set() # 添加 s.add(x) # 判断是否存在 if x in s: pass # 删除 s.discard(x)3)高频元素统计(面试常用)
python
运行
from collections import Counter nums = [1,2,2,3,3,3] cnt = Counter(nums) # cnt[2] 就是2出现次数2. 双指针 通用模板
适用:有序数组、两数之和、快慢指针、原地操作
python
运行
def two_pointer(nums): left = 0 right = len(nums) - 1 while left < right: # 逻辑判断 if 条件: left += 1 else: right -= 1快慢指针(链表 / 数组删除元素)
python
运行
slow = 0 for fast in range(len(nums)): if 满足保留条件: nums[slow] = nums[fast] slow += 13. 滑动窗口 通用模板(定长 / 不定长)
不定长窗口(最长 / 最短子数组、子串)
python
运行
def slidingWindow(nums): left = 0 res = 0 window_sum = 0 for right in range(len(nums)): # 右侧元素入窗口 window_sum += nums[right] # 窗口收缩:不满足条件就左移 while 窗口超标条件: window_sum -= nums[left] left += 1 # 更新答案 res = max(res, right - left + 1) return res4. 栈(Stack)万能模板
适用:括号匹配、单调栈、逆序、表达式计算
python
运行
stack = [] # 入栈 stack.append(x) # 出栈(不为空才能弹) if stack: top = stack.pop() # 取栈顶不删除 top = stack[-1] if stack else None经典:有效括号
python
运行
def isValid(s): stack = [] mp = {")":"(", "]":"[", "}":"{"} for c in s: if c in mp: top = stack.pop() if stack else "" if top != mp[c]: return False else: stack.append(c) return len(stack) == 05. BFS 广度优先搜索(层序遍历、地图、最短路径)
python
运行
from collections import deque def bfs(grid, start): # 队列初始化 q = deque() q.append(start) # 访问标记 visited = set() visited.add(start) # 上下左右方向 dirs = [[-1,0],[1,0],[0,-1],[0,1]] while q: x, y = q.popleft() # 遍历四个方向 for dx, dy in dirs: nx = x + dx ny = y + dy # 边界+未访问判断 if 合法条件: visited.add((nx, ny)) q.append((nx, ny))二、数据工程师 完整备考路线(分阶段、可落地、面试直达)
核心定位
数据工程师面试四大块:Python 算法 + SQL(重中之重)+ 大数据组件 (Hadoop/Spark/Hive) + 数仓理论 + 八股
阶段 1:基础恢复期(1~2 周・你现在立刻开始)
- Python
- 复习:列表、字典、字符串、循环、函数
- 刷题:简单数组、字符串、模拟、哈希(LeetCode 简单题)
- SQL
- DDL/DML/DQL 基础
- 多表查询、子查询、分组聚合、排序
- 必会:
group by、join、limit、distinct
- 大数据入门概念
- 分布式、集群、主从、分片、副本
阶段 2:核心强化期(2~4 周)
- 算法
- 主攻:双指针、滑动窗口、哈希、栈、简单 BFS
- 不啃难题:不刷复杂 DP、困难图论
- SQL(数工最拉分)
- 窗口函数:row_number、rank、lag、lead
- 分区、分桶、时间函数、数据去重
- 手写 SQL:行列转换、连续问题、留存统计
- 大数据组件
- Hadoop:HDFS、YARN、MapReduce 原理
- Hive:数仓分层、分区、分桶、数据倾斜
- Spark:RDD、DataFrame、宽窄依赖、缓存
阶段 3:八股 + 项目 + 面试冲刺(2 周)
- 八股汇总
- 数据库:MySQL 索引、事务、隔离级别、主从复制
- Redis:缓存三大问题、持久化、数据结构
- 数仓:维度、事实表、SCD、分层 ODS/DWD/DWS/ADS
- 项目包装
- 你的装配式建筑 / 点云 / 成本预测 → 改造为数据处理 + 数据分析项目
- 模拟面试
- 手撕 SQL、手撕 Python 算法、口头答八股
每日固定学习节奏(适合研究生 / 应届生)
- 30min:Python 算法手写 1~2 题
- 60min:SQL 刷题 + 函数练习
- 60min:大数据 / 数仓理论背诵
- 30min:八股复盘记忆
三、5 道极简入门 Python 算法题(长期没写代码,手打恢复手感)
全部难度极低,只用到:输入、循环、列表、条件判断
第 1 题:两数求和
题目:输入一行两个整数,输出它们的和
python
运行
# 手写代码 a, b = map(int, input().split()) print(a + b)第 2 题:数组最大值
题目:输入一串整数,找出并输出最大值
python
运行
nums = list(map(int, input().split())) max_val = nums[0] for num in nums: if num > max_val: max_val = num print(max_val)第 3 题:统计奇数个数
题目:输入一组数字,统计里面有多少个奇数
python
运行
nums = list(map(int, input().split())) cnt = 0 for n in nums: if n % 2 != 0: cnt += 1 print(cnt)第 4 题:字符串反转
题目:输入一个字符串,反转后输出
python
运行
s = input().strip() res = s[::-1] print(res)第 5 题:列表去重
题目:输入一串数字,去除重复元素后输出
python
运行
nums = list(map(int, input().split())) new_nums = list(set(nums)) print(new_nums)下一步你需要什么,我继续无缝衔接
- 我给你数据工程师必背 SQL 100 题 + 核心函数笔记?
- 还是给你大数据 + Hive + 数仓 高频八股精简背诵版?
- 或是给你定制「每日打卡学习计划表」?
把第一部分的算法面试万能模板用具体的题目以及代码解法和相关注释呈现出来,尽量细致一点,若是还有别的比较重要的算法题,也可以一起生成题目及答案。我先打一遍,后面再谈熟练解题。
Python 算法面试万能模板|配套真题 + 详细注释 + 可直接手打
包含:哈希、双指针、滑动窗口、栈、BFS,额外补充「二分查找、简单贪心」高频必考模板,每一类都给:经典真题 + 完整可运行代码 + 逐行注释 + 思路总结,你直接手打一遍,立刻恢复 Python 手感。
一、哈希表(dict /set/ Counter)
经典真题 1:两数之和(LeetCode 1)
题目
给定整数数组nums和目标值target,找出和为target的两个下标并返回。
python
运行
def twoSum(nums, target): # 哈希字典:key=数组元素,value=元素下标 hash_map = {} # 遍历数组,enumerate 同时拿下标+值 for idx, num in enumerate(nums): # 需要配对的另一个数 need = target - num # 如果需要的数已经在哈希中,直接返回答案 if need in hash_map: return [hash_map[need], idx] # 不在就存入当前数,供后续遍历匹配 hash_map[num] = idx # 测试 if __name__ == "__main__": arr = [2,7,11,15] print(twoSum(arr, 9)) # 输出 [0,1]经典真题 2:数组去重 + 元素计数
python
运行
from collections import Counter # 1. set 快速去重 nums = [1,2,2,3,3,3] unique_nums = list(set(nums)) print("去重后:", unique_nums) # 2. Counter 统计每个元素出现次数 count = Counter(nums) print("2 出现次数:", count[2]) print("3 出现次数:", count[3])核心总结
dict:存映射、快速查找、O (1) 查询set:专门去重、判断元素是否存在Counter:一键统计频次,面试高频
二、双指针算法(左右指针 + 快慢指针)
真题 1:有序数组两数之和(左右指针)
题目
升序数组,找两个数之和等于 target,返回两个数字。
python
运行
def twoSumSorted(nums, target): # 左指针:最左侧 left = 0 # 右指针:最右侧 right = len(nums) - 1 while left < right: total = nums[left] + nums[right] if total == target: # 找到答案,直接返回 return [nums[left], nums[right]] elif total < target: # 和太小,左指针右移,增大和 left += 1 else: # 和太大,右指针左移,减小和 right -= 1 return [] # 测试 arr = [2,3,4,7,11] print(twoSumSorted(arr, 9))真题 2:删除有序数组重复项(快慢指针)
python
运行
def removeDuplicates(nums): if not nums: return 0 # 慢指针:维护不重复数组的边界 slow = 0 # 快指针:逐个遍历 for fast in range(len(nums)): # 元素不同,说明是新元素 if nums[fast] != nums[slow]: slow += 1 nums[slow] = nums[fast] # 不重复数组长度 return slow + 1 # 测试 a = [1,1,2,2,3] print(removeDuplicates(a))双指针适用场景
有序数组、原地删除、回文判断、区间查找
三、滑动窗口(子数组 / 子串 必考)
真题:最长无重复子串(LeetCode 3)
题目
找出字符串中最长的无重复字符的子串长度。
python
运行
def lengthOfLongestSubstring(s): # 左窗口边界 left = 0 # 记录窗口内字符 window = set() max_len = 0 # 右窗口逐个扩张 for right in range(len(s)): # 出现重复,不断左移窗口,直到无重复 while s[right] in window: window.remove(s[left]) left += 1 # 加入当前字符 window.add(s[right]) # 更新最大长度 max_len = max(max_len, right - left + 1) return max_len # 测试 print(lengthOfLongestSubstring("abcabcbb"))滑动窗口万能逻辑
- 右指针不断入窗口
- 不满足条件,收缩左指针
- 每轮更新最优答案
适用:子数组和、最长子串、最小覆盖、连续区间问题
四、栈(Stack)经典题型
真题:有效的括号(LeetCode 20)
题目
判断括号是否合法配对。
python
运行
def isValid(s): # 建立括号映射:右括号 -> 左括号 match = {")":"(", "]":"[", "}":"{"} stack = [] for char in s: # 如果是右括号 if char in match: # 栈空 or 栈顶不匹配,直接非法 top = stack.pop() if stack else "" if top != match[char]: return False else: # 左括号直接入栈 stack.append(char) # 最后栈必须为空 return len(stack) == 0 # 测试 print(isValid("()[]{}")) # True print(isValid("(]")) # False栈高频场景
括号匹配、字符串逆序、单调栈(每日温度)、表达式运算
五、BFS 广度优先搜索(最短路径 / 层序遍历)
真题:岛屿数量(LeetCode 200 简化版)
python
运行
from collections import deque def numIslands(grid): if not grid or not grid[0]: return 0 rows = len(grid) cols = len(grid[0]) count = 0 # 上下左右 四个方向 dirs = [[-1,0],[1,0],[0,-1],[0,1]] def bfs(x, y): q = deque() q.append((x, y)) # 标记为已访问(改为水) grid[x][y] = "0" while q: cur_x, cur_y = q.popleft() # 遍历四个方向 for dx, dy in dirs: nx = cur_x + dx ny = cur_y + dy # 边界合法 + 是陆地 if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == "1": grid[nx][ny] = "0" q.append((nx, ny)) # 遍历整个网格 for i in range(rows): for j in range(cols): if grid[i][j] == "1": count += 1 bfs(i, j) return count # 测试用例 g = [ ["1","1","0","0"], ["1","1","0","0"], ["0","0","1","1"] ] print(numIslands(g))BFS 核心
- 借助队列
deque - 适合:最短路径、图遍历、层序、网格问题
六、额外补充 2 个面试必考模板(必背)
1. 二分查找(有序数组)
python
运行
def binarySearch(nums, target): left = 0 right = len(nums) - 1 while left <= right: # 中间位置 mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return -12. 简单贪心(最大利润 / 最优选择)
python
运行
# 买卖股票最佳时机 def maxProfit(prices): min_price = float("inf") profit = 0 for p in prices: min_price = min(min_price, p) profit = max(profit, p - min_price) return profit七、手打建议(你现在直接执行)
- 按顺序:哈希 → 双指针 → 滑动窗口 → 栈 → BFS
- 每道题:
- 先遮住答案自己敲
- 对照注释理解每一步作用
- 全部敲完,算法基础手感 100% 恢复
