Python自动化测试面试核心:哈希与递归算法实战解析

追风的人
追风的人
发布时间:2026-10-13| 3人浏览过
原创

本文深入解析Python自动化测试面试中的高频编程题。重点讲解如何利用哈希结构(字典、集合)实现高效去重与查找优化,针对海量数据Top K问题对比内存与时间复杂度策略,并剖析递归在阶乘、二叉树遍历等场景中的分层推导逻辑,助力测试人员提升编码能力。

Python自动化测试面试核心:哈希与递归算法实战解析

前言

随着行业技术的演进,编程能力已逐渐成为软件测试工程师的核心素养之一。因此,在各类笔试与面试环节中,编码题目已成为常规考察内容,主要旨在评估候选人的以下关键能力。

  • 基础编码能力及逻辑思维
  • 对基本数据结构(如顺序表、链表、队列、栈、二叉树)的掌握程度
  • 基本算法(排序、查找、递归)及其时间复杂度的分析能力

面试高频算法思想:哈希、递归与分治

除了上述基础算法外,笔试与面试中高频考察以下三种核心算法思想:

  • 哈希
  • 递归
  • 分治

哈希算法实战:去重与效率优化

哈希

在Python中,哈希对应映射类型,主要包括字典和集合。其核心特征是键值唯一且查找效率极高。对于序列(列表、元组、字符串),元素查找的时间复杂度为O(n);而利用字典和集合进行查找,时间复杂度可降至O(1)。因此,哈希在处理列表问题时主要发挥两种作用:

数据去重

优化查找效率

例题1:列表去重#

若对去重后的顺序无要求,可直接使用set()进行转换(转换后列表会自动排序);若需保持原有顺序,可利用字典的fromkeys()方法,借助字典键值的唯一性来实现去重。

不考虑顺序的情况:


l = [2,1,2,3,4,5,6,6,5,4,3,2,1]
result = list(set(l))
print(result)

运行结果:

[1, 2, 3, 4, 5, 6]

考虑顺序的情况:


l = [2,1,2,3,4,5,6,6,5,4,3,2,1]
result = list({}.fromkeys(l).keys())
print(result)

运行结果:

[2, 1, 3, 4, 5, 6]

例题2:分组

针对包含字母和数字的字符串,需找出相同字符或数字,并按出现次数进行排序。


l = [1,2,3,'a','b','c',1,2,'a','b',3,'c','d','a','b',1]
set1 = set(l)
result = [(item, l.count(item)) for item in set1]
result.sort(key=lambda x:x[1], reverse=True)
print(result)

此处利用哈希键值不重复的特性。此外,也可使用Python内置的groupby函数,具体代码如下:


from itertools import groupby

l = [1,2,3,'a','b','c',1,2,'a','b',3,'c','d','a','b',1]
l.sort(key=lambda x: str(x)) # 分组前需要先排序
result = []
for item, group in groupby(l, key=lambda x: str(x)):
  result.append((item, len(list(group))))
result.sort(key=lambda x:x[1], reverse=True)
print(result)

例题3:海量数据找出Top K的数据#

对于小数据量,可直接采用排序加切片的方式;而对于海量数据,必须综合考量服务器硬件限制,即在时间效率、内存占用及数据特征之间取得平衡。若存在大量重复数据,可先通过哈希去重以降低处理量。

此处演示使用生成器生成1000万个随机整数,并求解其中最大的1000个数。生成随机数的代码如下:


import random
import time
n = 10000 * 1000
k = 1000
print(n)
def gen_num(n):
  for i in range(n):
    yield random.randint(0, n)
l = gen_num(n)

若内存不受限制,可直接使用set()去重后排序。


start = time.time()
l = list(set(l))
result = l[-k:]
result.reverse()
print(time.time()-start)

1000w个数据全部载入内存,经set处理后列表自动呈递增顺序,通过切片取最后1000个元素即可得到Top 1000的数值。

使用堆排序可进一步节省内存空间。


start = time.time()
result = heapq.nlargest(k, l)
print(time.time()-start)

此处调用Python内置的堆排序库heapq。使用nlargest(k, l)函数可直接获取序列l中最大的k个数。

若内存较小,可采用分治策略,利用多线程对数据进行分组处理(此处略)。

例题4:两数之和#

给定列表l=[1,2,3,4,5,6,7,8](数据无重复),目标值target=6,需快速找出数组中两个元素之和等于target的元素下标。

注意,应避免使用双重循环暴力比对target的做法。正确的思路是单层循环,计算target与当前值的差值,并判断该差值是否存在于列表中。

然而,若直接在列表中执行in查询,其时间复杂度为O(n),这隐含了一层循环,导致整体效率仍为O(n^2),与双重循环无异。

此时引入哈希优化差值查询操作,将单次查询复杂度从O(n)降至O(1),从而使总体效率由O(n^2)优化为O(n)。


l = [1,2,3,4,5,6,7,8]
set1 = set(list1)  # 使用集合已方便查找
target = 6

result = []
for a in list1:
  b = target - a
  if a < b < target and b in set1:  # 在集合中查找,为避免重复,判断a为较小的那个值
    result.append((list1.index(a), list1.index(b)))  # 列表index取下标的操作为O(1) 
print(result)

递归算法应用:从阶乘到二叉树

递归问题

递归是指函数调用自身的机制,常用于解决以下高频面试问题:

  • 阶乘计算
  • 斐波那契数列
  • 跳台阶、变态跳台阶问题
  • 快速排序
  • 二分查找
  • 二叉树深度遍历(前序、中序、后序)
  • 求二叉树深度
  • 平衡二叉树判断
  • 判断两颗树是否相同

递归是一种通过分层推导来解决问题的方法,也是极其重要的编程思想。递归能迅速将复杂问题层级化、简单化,只需关注出口条件及每一层的推导逻辑即可。

以阶乘为例,要求解n!,只需知晓前一个数的阶乘(n-1)!,再乘以n即可。因此问题转化为求解上一个数的阶乘,依次向前递推,直至处理第一个数。

举一个通俗的例子:

假设A欠你10万,但资金不足;B欠A 8万;C欠B 7万,且C当前资金充足。因此,你需要逐层追溯至C,由C开始层层还款,最终你才能拿到属于你的10万元。

至此,关于Python自动化测试笔试面试题精选的介绍已接近尾声。更多Python自动化测试面试中常见的编程题内容,请搜索本站历史文章或继续浏览后续相关文章。希望大家今后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。