编程与算法
2026/8/21大约 2 分钟
编程与算法
手写:冒泡排序 / 快速排序 / 二分查找
- 冒泡:相邻比较交换,O(n²);快速排序:分治 + 基准值,平均 O(n log n);二分查找:有序数组折半,O(log n),注意边界(
left <= right)。
Python 列表与元组的区别?
- 元组不可变、可哈希(可作 dict key)、性能略好;列表可变。
list常用方法:append/extend/pop/sort。
Python 装饰器是什么?写一个计时装饰器
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} 耗时 {time.time() - start:.4f}s")
return result
return wrapper
@timer
def do_something():
time.sleep(0.1)Python 生成器是什么?和迭代器的区别?
- 生成器用
yield惰性求值,节省内存,一次只产出下一个值;迭代器实现了__iter__/__next__协议;生成器是一种特殊的迭代器。range()、大文件逐行读取常用生成器。
深拷贝与浅拷贝的区别?
- 浅拷贝:只复制最外层容器,内部可变对象仍共享引用;深拷贝:递归复制所有对象。
list[:]、copy.copy()是浅拷贝;copy.deepcopy()是深拷贝。
Python 中 *args 和 **kwargs 的作用?
*args收集任意数量的位置参数为元组;**kwargs收集任意数量的关键字参数为字典;常用于装饰器与通用封装。
什么是多线程?Python 多线程的 GIL 问题?
- 多线程适合 IO 密集型(网络请求、读写文件);GIL 使同一时刻只有一个线程执行 Python 字节码,CPU 密集型应用多线程无法加速,应用多进程(
multiprocessing)或协程(asyncio)。
手写:反转字符串 / 判断回文 / 求最长公共前缀
- 反转:
s[::-1];回文:s == s[::-1];最长公共前缀:纵向逐列比较所有字符串。
如何统计一个字符串中每个字符出现的次数?
from collections import Counter
Counter("hello world")
# 或
d = {}
for c in s:
d[c] = d.get(c, 0) + 1