告别手写冗余代码!Python算法刷题懒人神器:全网最全内置函数+标准库用法(附真题代码)

博客前言

很多刚入门算法刷题的同学,都会陷入一个误区:不管什么题目,全部从零手写逻辑,手写排序、手写二分、手写最大公约数、手写进制转换,不仅代码冗长繁琐,还极易出现边界bug,白白浪费做题时间。

但其实Python为算法刷题量身打造了大量无需额外安装、开箱即用的内置函数和标准库,不用自己造轮子,一行代码就能搞定高频算法需求。无论是LeetCode、牛客网还是校招笔试,原生库完全可以直接使用,不会出现编译报错、平台禁用的问题。

本文整合刷题90%以上场景会用到的Python便捷工具,分为:基础内置万能函数、数学math库、进制转换工具、列表排序工具、容器增强collections库、二分查找bisect库、堆结构heapq库七大板块,每个工具都搭配算法真题场景+可直接运行代码+避坑细节,全文干货无废话,建议刷题时直接打开对照使用。

阅读对象:算法刷题新手、Python笔试备考选手、想要精简代码提升做题速度的程序员

前置说明:本文所有工具均为Python原生自带库,无需pip安装,刷题平台直接调用。


一、零导入!Python原生内置函数,不用import直接用

这类函数是Python解释器自带,不需要导入任何包,打开代码就能用,覆盖数值运算、逻辑判断、输入输出、类型转换全场景,是刷题最基础也最常用的工具。

1.1 数值快捷运算函数

  • abs(x):一键求绝对值,不仅支持整数、浮点数,还支持复数求模,无需手写判断正负

  • divmod(a, b):同时返回商和余数,等价于(a//b, a%b),整除类题目神器

  • pow(x, y, mod):快速幂运算,支持三参数取模,解决大数幂次溢出问题,比**运算符效率高很多

# 真题场景:数字反转、大数取模
print(abs(-123))  # 123,数字反转常用
print(divmod(10, 3))  # (3,1),商3余数1
print(pow(2, 10, 1000))  # 24,2的10次方对1000取模,一行搞定快速幂

1.2 逻辑判断与迭代函数

  • all(iterable):可迭代对象所有元素为True才返回True,判断数组是否全满足条件

  • any(iterable):可迭代对象任意一个元素为True就返回True,判断数组是否存在符合条件的值

# 真题场景:判断数组是否全部为偶数
nums = [2,4,6,8]
print(all(x%2==0 for x in nums))  # True
print(any(x>10 for x in nums))   # False

1.3 输入处理神器map()

算法笔试最头疼的就是多行多组输入,map函数可以一行完成输入分割+类型转换,告别繁琐的split循环。

# 常规输入:一行输入多个整数
nums = list(map(int, input().split()))
print(nums)

# 一行输入两个变量
a, b = map(int, input().split())


二、math数学库:告别手写数学公式,覆盖全部数论与几何题目

刷题中最大公约数、最小公倍数、开方、对数、三角函数、向上/向下取整都是高频考点,自己手写不仅代码多,还容易精度出错,导入math库一行直接解决。

导入方式:import math

2.1 数论高频函数(笔试必考)

  1. math.gcd(a,b):求两个数最大公约数,注意:仅支持非负数,返回正整数

  2. math.lcm(a,b):Python3.9+新增,直接求最小公倍数,不用公式推导

  3. math.factorial(n):一键计算阶乘,告别递归手写阶乘

import math
print(math.gcd(12, 18))  # 6 最大公约数
print(math.lcm(12, 18))  # 36 最小公倍数
print(math.factorial(5)) # 120 5的阶乘

2.2 浮点数取整与幂方运算

  • math.ceil(x):向上取整,天花板函数

  • math.floor(x):向下取整,地板函数

  • math.sqrt(x):开平方根,返回浮点数

print(math.ceil(3.2))  # 4
print(math.floor(3.9)) # 3
print(math.sqrt(16))   # 4.0

2.3 math库刷题避坑要点

1. math.gcd只接收两个参数,求多个数最大公约数需要循环调用; 2. math.gcd会自动忽略负数,输入负数等同于输入绝对值; 3. 开平方不要用**0.5,精度不如math.sqrt。


三、进制转换内置函数:bin/oct/hex,进制题直接秒杀

进制转换是笔试选择题、编程小题常客,Python内置三个原生函数,无需手写除基取余算法,一行完成十进制与二/八/十六进制互转。

3.1 三大进制转换函数

  • bin(n):十进制转二进制,返回字符串,自带前缀0b

  • oct(n):十进制转八进制,返回字符串,自带前缀0o

  • hex(n):十进制转十六进制,返回字符串,自带前缀0x

  • int(str, base):任意进制字符串转回十进制,万能逆转换

3.2 真题代码演示(二进制1的个数经典题)

# 题目:统计一个数字二进制中1的个数
n = 10
binary_str = bin(n)  # '0b1010'
count = binary_str.count('1')
print(count)  # 输出2,一行解决二进制统计问题

# 任意进制转回十进制
print(int('1010', 2))  # 二进制1010转十进制:10
print(int('ff', 16))   # 十六进制ff转十进制:255

3.3 刷题小技巧

如果需要去除前缀,直接切片即可:bin\(10\)\[2:\],得到纯净二进制字符串1010,不需要额外字符串处理。


四、列表排序sort/sorted:不用手写快排,自定义排序一步到位

排序是算法题最基础的操作,Python内置两种排序方法,底层都是优化版Timsort,时间复杂度O(nlogn),效率远超手写冒泡、选择排序,同时支持自定义规则、倒序、多维度排序。

4.1 sort() 与 sorted() 核心区别

  • list.sort():原地排序,直接修改原列表,无返回值,节省内存

  • sorted(list):生成新列表排序,不修改原数据,通用性更强

4.2 基础用法+真题场景

nums = [3,1,4,2]
# 正向排序
nums.sort()
print(nums) # [1,2,3,4]

# 倒序排序
nums.sort(reverse=True)
print(nums) # [4,3,2,1]

# 不修改原列表排序
new_nums = sorted(nums)

4.3 高阶:自定义key排序(笔试高频)

算法题常考:按数组元素绝对值排序、按字符串长度排序、二维数组按第二列排序,key参数一行搞定。

# 1. 按绝对值排序
arr = [-5, 3, -2, 4]
arr.sort(key=lambda x:abs(x))
print(arr) # [-2, 3, 4, -5]

# 2. 二维数组按第二个元素排序
matrix = [[1,3],[2,1],[3,2]]
matrix.sort(key=lambda x:x[1])
print(matrix) # [[2,1],[3,2],[1,3]]


五、collections容器库:刷题最强数据结构工具库

Python原生list、dict、set功能有限,而collections库补充了刷题必备的高级容器,包括计数器、双端队列、默认字典、有序字典,完美适配哈希表、队列、频次统计类题目,是刷题使用率最高的库。

导入方式:from collections import Counter, deque, defaultdict

5.1 Counter:一键统计元素频次,秒杀哈希计数题

不用自己遍历字典统计次数,Counter直接统计列表、字符串中每个元素出现次数,适配:两数之和、异位词判断、多数元素等高频题目。

from collections import Counter
s = "abracadabra"
cnt = Counter(s)
print(cnt) # 统计每个字符出现次数
print(cnt['a']) # 5,直接获取a的频次

# 真题:判断两个字符串是否为异位词
def isAnagram(s,t):
    return Counter(s) == Counter(t)

5.2 deque:高效双端队列,BFS广度优先搜索标配

普通列表list的pop(0)时间复杂度为O(n),效率极低;而deque双端队列首尾增删元素都是O(1),是二叉树层序遍历、图BFS、滑动窗口题目必备工具。

from collections import deque
q = deque()
q.append(1)    # 队尾入队
q.appendleft(2)# 队首入队
q.popleft()    # 队首出队(高效)
q.pop()        # 队尾出队

5.3 defaultdict:避免字典键不存在报错

普通字典访问不存在的key会直接报错,defaultdict可以给字典设置默认值(列表、数字),不用额外判断key是否存在。

from collections import defaultdict
d = defaultdict(int)
nums = [1,2,2,3]
for num in nums:
    d[num] += 1
# 无需判断key是否存在,直接累加


六、bisect二分库:一行实现二分查找,不用手写边界

二分查找是算法必考考点,手写二分很容易出现left、right边界死循环、查找偏移错误,bisect库原生封装二分逻辑,针对有序数组直接查找插入位置,零bug完成二分。

导入方式:import bisect

6.1 四大核心函数

  • bisect_left:查找元素左侧插入下标,找不到返回第一个大于目标值的位置

  • bisect_right:查找元素右侧插入下标

  • insort_left/insort_right:直接将元素插入有序数组,保持数组有序

import bisect
nums = [1,2,4,5,7]
idx = bisect.bisect_left(nums,4)
print(idx) # 2,找到4所在下标

# 查找目标值不存在的场景
idx2 = bisect.bisect_left(nums,3)
print(idx2) # 2,3应该插入在下标2的位置

适用场景:搜索插入位置、有序数组查找、最长递增子序列简化写法。


七、heapq小顶堆:一行实现堆排序,TOPK问题秒杀

TOPK问题、数据流中位数、滑动窗口最大值是面试高频题,手写堆结构难度极大,Python heapq库直接封装小顶堆,几行代码解决堆相关算法题。

导入方式:import heapq

7.1 核心用法

  • heapq.heappush(heap, item):向堆中插入元素,自动维护堆结构

  • heapq.heappop(heap):弹出堆顶最小元素

  • heapq.nlargest(k, nums):直接获取数组前k大元素

7.2 真题:数组第K大元素

import heapq
nums = [3,2,1,5,6,4]
k = 2
# 获取第二大元素
res = heapq.nlargest(k, nums)[-1]
print(res) # 5

注意:Python默认只有小顶堆,想要实现大顶堆,只需要将元素取负数存入堆中即可。


八、刷题避坑总结:什么时候不要用库函数?

虽然Python原生库极其方便,但在两种场景下建议手动手写逻辑,方便理解算法底层原理:

  1. 算法原理面试口述:面试官让你手写二分、手写排序、手写最大公约数,不能直接调用库函数,需要掌握底层逻辑

  2. 极个别严格笔试:极少数笔试禁止使用高级容器,需要用基础列表实现队列、堆结构

除此之外,在线OJ刷题、日常刷题练习,放心无脑使用原生库,大幅缩短代码长度,降低出错概率。

九、全文工具速查表(刷题直接复制)

功能需求 对应工具 一句话用法
最大公约数/阶乘 math math.gcd()、math.factorial()
进制转换 bin/oct/hex bin(n)[2:]获取纯净二进制
数组排序 sort/sorted key自定义排序规则
频次统计/队列 collections Counter计数、deque做BFS
二分查找 bisect bisect_left快速查找下标
TOPK问题 heapq nlargest直接取前k个元素

博客结语

Python刷题最大的优势,就是丰富且强大的原生标准库。算法刷题的核心是解题思路,而不是重复造轮子写底层基础逻辑。熟练掌握以上内置函数和标准库,可以让你的代码精简50%以上,做题速度提升一倍,同时减少低级bug。

后续我会持续更新Python刷题一行代码骚操作、力扣高频题极简Python解法,关注我,算法刷题不走弯路!