Java → Python 算法刷题速成指南
目标:不是全面学完 Python ,而是用最短时间学会"用 Python 写常见算法题"。
适合:已经会用 Java 刷题,但笔试强制要求用 Python 的情况。
1. 必备语法映射(Java 对照 Python)
1.1 输入输出
- Java
ini
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
- Python
python
n = int(input())
arr = list(map(int, input().split()))
要点:
- 不写类型、不写分号。
- 多个整数一行输入时,用
split()+map(int, ...)。
1.2 变量与基本语句
-
声明变量
- Java:
int x = 0; - Python:
x = 0
- Java:
-
条件语句
-
Java:
cssif (a > b) { ... } else if (a == b) { ... } else { ... } -
Python:
lessif a > b: ... elif a == b: ... else: ...
要点:没有括号、没有花括号,用缩进 + 冒号
:表示代码块。 -
-
循环
-
Java
for:cssfor (int i = 0; i < n; i++) { ... } -
Python
for:scssfor i in range(n): ... -
Java
while:arduinowhile (condition) { ... } -
Python
while:arduinowhile condition: ...
-
1.3 函数(方法)定义
- Java
arduino
int add(int a, int b) {
return a + b;
}
- Python
python
def add(a, b):
return a + b
要点:
- 用
def定义函数。 - 不写返回类型。
- 末尾不写分号。
2. 刷题常用容器写法
2.1 列表(相当于 Java 的 ArrayList)
ini
arr = [] # 空列表
arr.append(x) # 尾部追加
arr.pop() # 弹出最后一个元素
arr[i] # 下标访问
len(arr) # 长度
arr.sort() # 原地升序排序
arr.sort(reverse=True) # 原地降序
arr2 = sorted(arr) # 返回新排序列表,不修改原列表
初始化:
ini
arr = [0] * n # 长度为 n 的 0 数组
arr = [1, 2, 3] # 直接字面量
2.2 栈与队列
- 栈(Stack)
ini
stack = []
stack.append(x) # 入栈
stack.pop() # 出栈(弹出栈顶)
- 队列(Queue,BFS 常用)
css
from collections import deque
q = deque()
q.append(x) # 入队
q.popleft() # 出队(弹出队头)
2.3 集合与字典(相当于 HashSet / HashMap)
- 集合
set(去重、判重)
scss
s = set()
s.add(x)
if x in s:
...
- 字典
dict(键值映射,计数、映射关系)
ini
mp = {}
mp[key] = value
if key in mp:
...
cnt = mp.get(key, 0) + 1 # 获取计数,不存在时默认为 0
mp[key] = cnt
2.4 字符串操作
ini
s[i] # 下标访问
s[i:j] # 子串(切片,含 i 不含 j)
s.split() # 按空格分割
s.split(',') # 按逗号分割
chars = list(s) # 转成列表(可修改)
res = ''.join(chars) # 列表拼成字符串
3. 五大经典算法模板(Python 版本)
3.1 二分查找模板
适用:有序数组中找某个值 / 下标。
sql
def binary_search(nums, target):
left, right = 0, 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 -1
思路与 Java 完全一样,只是语法变成 Python。
3.2 DFS / 递归(树、图)
以二叉树遍历为例:
python
def dfs(root):
if not root:
return
# 前序位置
# print(root.val)
dfs(root.left)
dfs(root.right)
图的 DFS:
scss
def dfs(u, graph, visited):
visited.add(u)
for v in graph[u]:
if v not in visited:
dfs(v, graph, visited)
3.3 BFS 模板(最短路 / 层序遍历)
scss
from collections import deque
def bfs(start, graph):
q = deque()
visited = set()
q.append(start)
visited.add(start)
while q:
u = q.popleft()
# 处理 u
for v in graph[u]:
if v not in visited:
visited.add(v)
q.append(v)
3.4 回溯模板(排列 / 组合 / 子集)
组合(例如从 nums 中选出所有长度为 k 的组合):
scss
def combine(nums, k):
res = []
path = []
def backtrack(start):
if len(path) == k:
res.append(path[:])
return
for i in range(start, len(nums)):
path.append(nums[i])
backtrack(i + 1)
path.pop()
backtrack(0)
return res
排列(全排列):
python
def permute(nums):
res = []
path = []
used = [False] * len(nums)
def backtrack():
if len(path) == len(nums):
res.append(path[:])
return
for i in range(len(nums)):
if used[i]:
continue
used[i] = True
path.append(nums[i])
backtrack()
path.pop()
used[i] = False
backtrack()
return res
3.5 前缀和 / 滑动窗口(数组、子数组题很常见)
- 前缀和
ini
def prefix_sum(nums):
n = len(nums)
pre = [0] * (n + 1)
for i in range(n):
pre[i + 1] = pre[i] + nums[i]
return pre
# 计算区间 [l, r] 的和(0-based)
# sum(nums[l:r+1]) = pre[r+1] - pre[l]
- 滑动窗口(最长 / 最短子串、子数组)
ini
def sliding_window(s, k):
# 示例:求长度为 k 的子串最大和(如果是数组则同理)
n = len(s)
if n < k:
return 0
window_sum = sum(s[:k])
ans = window_sum
for i in range(k, n):
window_sum += s[i] - s[i - k]
ans = max(ans, window_sum)
return ans
4. 建议的速成练习路径
-
第 1 天(2~3 小时)
- 把第 1 章语法映射看一遍。
- 选 2~3 道你用 Java 做过的简单题(如:数组最大值、两数之和、斐波那契),强行用 Python 改写。
-
第 2~3 天
- 针对列表/集合/字典/队列,刷 8~10 道简单题(数组、哈希表、栈队列、字符串)。
-
第 4~7 天
- 每天选一个模板(比如二分、DFS/BFS、回溯、滑动窗口),
- 先对照本文件里的 Python 模板抄一遍,
- 再用这个模板刷 2~3 题加深记忆。
5. 笔试实战小技巧
- 优先用自己最熟的几套 Python 模板,不要在考场上玩新花样。
- 如果一时间想不到最优解,先写一个正确的暴力解,Python 代码短、写得快,先拿基础分。
- 多利用内置函数:
max,min,sum,sorted,any,all,可以极大缩短代码长度。 - 记住:思路用 Java 想,代码用 Python 写------把语法映射清楚,你的算法能力是可以直接迁移过来的。## Java → Python 算法刷题速成指南
目标:不是全面学完 Python ,而是用最短时间学会"用 Python 写常见算法题"。
适合:已经会用 Java 刷题,但笔试强制要求用 Python 的情况。
1. 必备语法映射(Java 对照 Python)
1.1 输入输出
- Java
ini
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
- Python
python
n = int(input())
arr = list(map(int, input().split()))
要点:
- 不写类型、不写分号。
- 多个整数一行输入时,用
split()+map(int, ...)。
1.2 变量与基本语句
-
声明变量
- Java:
int x = 0; - Python:
x = 0
- Java:
-
条件语句
-
Java:
cssif (a > b) { ... } else if (a == b) { ... } else { ... } -
Python:
lessif a > b: ... elif a == b: ... else: ...
要点:没有括号、没有花括号,用缩进 + 冒号
:表示代码块。 -
-
循环
-
Java
for:cssfor (int i = 0; i < n; i++) { ... } -
Python
for:scssfor i in range(n): ... -
Java
while:arduinowhile (condition) { ... } -
Python
while:arduinowhile condition: ...
-
1.3 函数(方法)定义
- Java
arduino
int add(int a, int b) {
return a + b;
}
- Python
python
def add(a, b):
return a + b
要点:
- 用
def定义函数。 - 不写返回类型。
- 末尾不写分号。
2. 刷题常用容器写法
2.1 列表(相当于 Java 的 ArrayList)
ini
arr = [] # 空列表
arr.append(x) # 尾部追加
arr.pop() # 弹出最后一个元素
arr[i] # 下标访问
len(arr) # 长度
arr.sort() # 原地升序排序
arr.sort(reverse=True) # 原地降序
arr2 = sorted(arr) # 返回新排序列表,不修改原列表
初始化:
ini
arr = [0] * n # 长度为 n 的 0 数组
arr = [1, 2, 3] # 直接字面量
2.2 栈与队列
- 栈(Stack)
ini
stack = []
stack.append(x) # 入栈
stack.pop() # 出栈(弹出栈顶)
- 队列(Queue,BFS 常用)
css
from collections import deque
q = deque()
q.append(x) # 入队
q.popleft() # 出队(弹出队头)
2.3 集合与字典(相当于 HashSet / HashMap)
- 集合
set(去重、判重)
scss
s = set()
s.add(x)
if x in s:
...
- 字典
dict(键值映射,计数、映射关系)
ini
mp = {}
mp[key] = value
if key in mp:
...
cnt = mp.get(key, 0) + 1 # 获取计数,不存在时默认为 0
mp[key] = cnt
2.4 字符串操作
ini
s[i] # 下标访问
s[i:j] # 子串(切片,含 i 不含 j)
s.split() # 按空格分割
s.split(',') # 按逗号分割
chars = list(s) # 转成列表(可修改)
res = ''.join(chars) # 列表拼成字符串
3. 五大经典算法模板(Python 版本)
3.1 二分查找模板
适用:有序数组中找某个值 / 下标。
sql
def binary_search(nums, target):
left, right = 0, 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 -1
思路与 Java 完全一样,只是语法变成 Python。
3.2 DFS / 递归(树、图)
以二叉树遍历为例:
python
def dfs(root):
if not root:
return
# 前序位置
# print(root.val)
dfs(root.left)
dfs(root.right)
图的 DFS:
scss
def dfs(u, graph, visited):
visited.add(u)
for v in graph[u]:
if v not in visited:
dfs(v, graph, visited)
3.3 BFS 模板(最短路 / 层序遍历)
scss
from collections import deque
def bfs(start, graph):
q = deque()
visited = set()
q.append(start)
visited.add(start)
while q:
u = q.popleft()
# 处理 u
for v in graph[u]:
if v not in visited:
visited.add(v)
q.append(v)
3.4 回溯模板(排列 / 组合 / 子集)
组合(例如从 nums 中选出所有长度为 k 的组合):
scss
def combine(nums, k):
res = []
path = []
def backtrack(start):
if len(path) == k:
res.append(path[:])
return
for i in range(start, len(nums)):
path.append(nums[i])
backtrack(i + 1)
path.pop()
backtrack(0)
return res
排列(全排列):
python
def permute(nums):
res = []
path = []
used = [False] * len(nums)
def backtrack():
if len(path) == len(nums):
res.append(path[:])
return
for i in range(len(nums)):
if used[i]:
continue
used[i] = True
path.append(nums[i])
backtrack()
path.pop()
used[i] = False
backtrack()
return res
3.5 前缀和 / 滑动窗口(数组、子数组题很常见)
- 前缀和
ini
def prefix_sum(nums):
n = len(nums)
pre = [0] * (n + 1)
for i in range(n):
pre[i + 1] = pre[i] + nums[i]
return pre
# 计算区间 [l, r] 的和(0-based)
# sum(nums[l:r+1]) = pre[r+1] - pre[l]
- 滑动窗口(最长 / 最短子串、子数组)
ini
def sliding_window(s, k):
# 示例:求长度为 k 的子串最大和(如果是数组则同理)
n = len(s)
if n < k:
return 0
window_sum = sum(s[:k])
ans = window_sum
for i in range(k, n):
window_sum += s[i] - s[i - k]
ans = max(ans, window_sum)
return ans
4. 建议的速成练习路径
-
第 1 天(2~3 小时)
- 把第 1 章语法映射看一遍。
- 选 2~3 道你用 Java 做过的简单题(如:数组最大值、两数之和、斐波那契),强行用 Python 改写。
-
第 2~3 天
- 针对列表/集合/字典/队列,刷 8~10 道简单题(数组、哈希表、栈队列、字符串)。
-
第 4~7 天
- 每天选一个模板(比如二分、DFS/BFS、回溯、滑动窗口),
- 先对照本文件里的 Python 模板抄一遍,
- 再用这个模板刷 2~3 题加深记忆。
5. 笔试实战小技巧
- 优先用自己最熟的几套 Python 模板,不要在考场上玩新花样。
- 如果一时间想不到最优解,先写一个正确的暴力解,Python 代码短、写得快,先拿基础分。
- 多利用内置函数:
max,min,sum,sorted,any,all,可以极大缩短代码长度。 - 记住:思路用 Java 想,代码用 Python 写------把语法映射清楚,你的算法能力是可以直接迁移过来的。