网站项目申报书建设规模,设计响应式网站多少钱,富阳网站建设洛洛科技,网站怎么做第二个页面前言如果你习惯了 C或者 Java 语法#xff0c;初次尝试用 Python 刷算法题#xff0c;那建议看看这篇博客#xff0c;这不是 Python 基础语法教程#xff0c;而是一份针对算法竞赛实战指南。这里汇集了最常用的库、那些让你事半功倍的语法糖#xff0c;以及 C/Java 选手容…前言如果你习惯了 C或者 Java 语法初次尝试用 Python 刷算法题那建议看看这篇博客这不是 Python 基础语法教程而是一份针对算法竞赛实战指南。这里汇集了最常用的库、那些让你事半功倍的语法糖以及 C/Java 选手容易踩的坑。一输入输出与环境配置 (I/O Setup)在 LeetCode 这种核心代码模式下不需要关心 I/O但在 ACM 模式如各大厂笔试、牛客、Codeforces中Python 的 I/O 速度是瓶颈。1. 极速输入输出当数据量达到 级别时input()和print()可能会导致 TLE (Time Limit Exceededimport sys # 替代 input() input sys.stdin.readline # 使用方式 n int(input()) arr list(map(int, input().split())) # 替代 print()注意 write 需要传入字符串且手动加换行 sys.stdout.write(str(ans) \n)2. 解除递归深度限制Python 默认递归深度通常是 1000做 DFS 或深搜时容易报错RecursionError。import sys sys.setrecursionlimit(10**6) # 设置为 100万足够应对大多数题目二核心数据结构与黑魔法 (Data Structures)1. 数组 (List)Python 的 List 是动态数组对应 Cvector/ JavaArrayList。切片 (Slicing)arr [0, 1, 2, 3, 4, 5] print(arr[::-1]) # 翻转数组O(N) print(arr[1:4]) # [1, 2, 3] # 技巧复制数组要用 b a[:]不能直接 b a那是引用初始化二维数组 (避坑)# ❌ 错误所有行都指向同一个对象 grid [[0] * m] * n # ✅ 正确 grid [[0] * m for _ in range(n)]2. 双端队列 (Deque)Python 的list模拟栈Stack很快append/pop是 O(1)但模拟队列Queue在头部插入/删除是 O(N)。务必使用collections.dequefrom collections import deque q deque([1, 2, 3]) q.append(4) # 队尾进 q.popleft() # 队头出O(1) # 也可以作为单调队列使用3. 哈希表 (Dict Set)Defaultdict (神器)C/Java 中访问不存在的 Key 会报错或返回 nullPython 的 defaultdict 可以自动初始化from collections import defaultdict # 计数器默认值为 0 cnt defaultdict(int) cnt[x] 1 # 邻接表默认值为列表 graph defaultdict(list) graph[u].append(v)Counter (计数器)from collections import Counter s abacaba c Counter(s) # Counter({a: 4, b: 2, c: 1}) print(c.most_common(1)) # 返回出现次数最多的元素4. 堆 (Heap)Python 只有小顶堆。如果需要大顶堆存入负数。import heapq nums [3, 1, 4, 1, 5] heapq.heapify(nums) # O(N) 建堆 min_val heapq.heappop(nums) # 弹出最小值 1 heapq.heappush(nums, 2) # 压入 2三必备标准库 (The Standard Library)有些题如果是 C 写需要手撸几十行Python 调库即可。1. 二分查找 (bisect)不需要手写left right了。import bisect arr [1, 3, 4, 4, 6] # 查找第一个 x 的位置 (lower_bound) idx1 bisect.bisect_left(arr, 4) # 返回 2 # 查找第一个 x 的位置 (upper_bound) idx2 bisect.bisect_right(arr, 4) # 返回 42. 排列组合 (itertools)import itertools nums [1, 2, 3] # 全排列 perm list(itertools.permutations(nums)) # 组合 (C(n, k)) comb list(itertools.combinations(nums, 2))3. 记忆化搜索 (functools)这是 DP动态规划选手的最爱。不用手动开memo数组加个装饰器即可。from functools import lru_cache lru_cache(None) # None 表示无大小限制 def dfs(i, j): if i 0 or j 0: return 0 # ... 你的逻辑 return res4. 数学工具 (math)import math math.gcd(a, b) # 最大公约数 math.lcm(a, b) # 最小公倍数 (Python 3.9) math.comb(n, k) # 组合数 C(n, k) x float(inf) # 无穷大四Pythonic 技巧与语法糖1. 自定义排序 (Lambda)对复杂对象排序不需要写 Comparator 类。points [[1, 2], [3, 1], [2, 4]] # 先按 x 升序若 x 相同按 y 降序 points.sort(keylambda x: (x[0], -x[1]))2. 同时遍历 (Zip Enumerate)# 想要 index 和 value for i, val in enumerate(nums): pass # 同时遍历两个数组 for a, b in zip(nums1, nums2): pass3. 解包 (Unpacking)# 交换变量 a, b b, a # 拆分数组 head, *mid, tail [1, 2, 3, 4, 5] # head1, mid[2,3,4], tail54. 任意与所有 (Any All)检查数组是否满足条件比写循环优雅。if any(x 0 for x in nums): print(存在负数) if all(x 0 for x in nums): print(全是正数)五C/Java 转 Python 的易错点1. 整数没有溢出Python 的int是高精度整数。优点不用担心long long越界大数运算直接算。缺点无法利用 32 位整数溢出来做某些位运算 trick。2. 变量全是引用 (Reference)这是最大的坑。在函数传参时不可变对象int, str, tuple表现像值传递。可变对象list, dict, set表现像引用传递。def modify(arr): arr.append(1) # 会改变外部变量 a [0] b a # b 是 a 的引用 c a[:] # c 是 a 的浅拷贝3. 字符不可变Python 的str是不可变的。不要在循环里做s c这是 $O(N^2)$ 的复杂度。做法先用 list 收集字符最后.join(list)。4. 没有do-while和i用while True: ... if break代替do-while。用i 1Python 不支持运算符。结语Python 在算法题中的优势在于将你的思维快速转化为代码。虽然它的原生运行速度不如 C但在大多数算法题的时间限制Time Limit设置上Python 会有更宽裕的时间通常是 C 的 2-5 倍。最后一句口诀遇到数组用 List频繁增删用 Deque快速查找用 Set计数统计用 Counter排序规则用 Lambda人生苦短用 Python。