前言
随着行业的发展,编程能力已经成为软件测试员工的基本能力。 因此笔试和面试中往往存在一定量的编码问题,主要考虑以下几点。
基本编码能力和思维逻辑
基本数据结构(顺序表、链表、队列、堆栈、二叉树) )。
基本算法(排序、搜索、递归)和时间复杂性
除了基本算法外,笔试面试还经常考察以下三种思想。
忧郁的蚂蚁
递归
分裂统治
忧郁的蚂蚁
忧郁蚂蚁即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 ) )
是打印(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 ) )
是打印(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=lambdax : x [1],reverse=True ) )。
是打印(result )
在这里使用忧郁的蚂蚁键值是没有再现性的。 当然,也可以使用python附带的groupby函数。 代码如下。
from ITER tools导入组by
l=[ 1,2,3,a ',b ',c ',1,2,a ',b ',3,c ',d ',a ',b ',1]
L.sort(key=lambdax:str ) x ) #在分组之前必须进行排序
result=[]
for item,groupingroupby(L,key=lambda x: str(x ) x ) ) :
result.append((item,len ) list (group ) )
result.sort (key=lambdax : x [1],reverse=True ) )。
是打印(result )
例题3 )从庞大的数据中找到top K的数据#
数据量小时可以使用排序片,但对于大量数据,必须考虑服务硬件的条件。 也就是说,既要考虑时间效率,也要考虑内存消耗,还要考虑数据的特点。 如果有大量的重复数据,可以先用忧郁的蚂蚁去减少数据量。
这里使用生成器生成1000万个随机整数,求出最大的1000个个数。 生成随机数的代码如下。
导入随机
导入时间
n=10000 * 1000
k=1000
是打印(n )
defgen_num(n ) :
forIinrange(n ) :
yeldrandom.randint(0,n ) ) ) ) ) ) )。
L=gen_num(n ) ) )
内存没有限制(set ) )进行排序
start=time.time (
l=list (设置(l ) )
result=l[-k:]
result.reverse (
打印(time.time ()-start () ) )。
1000w个数据全部读入存储器,set后列表自动按升序排列。 切片中从-1000到最后取的是top 1000的数量
使用堆可以节省内存
start=time.time (
result=heapq.nLargest(k,l ) ) ) ) ) ) ) )。
打印(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(n),因此整体效率为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(b(a,list1.index ) b ) )列表index的目标操作为o )1)
是打印(result )
递归问题
递归是循环调用自身的函数。 可用于解决以下高频问题。
阶乘
斐波那契数列
楼梯跳,变态跳
快速排序
二分搜索
二叉树的深度扫描(前序、中序、后序) ) ) ) ) ) )。
求二叉树的深度
平衡二叉树的判断
判断两棵树是否相同
递归是一种层次推导问题解决的方法,是一种非常重要的问题解决思想。 可以递归地将问题分层、简化,考虑出口和各层的导出即可。
像阶乘一样,想求n! 只需知道前面数的阶乘(n-1 )!再乘以n就可以了,所以问题可以求出前面的数的阶乘,然后依次前进到第一个数。
举个常见的例子:
A欠你10万,但他没有那么多钱。 b是A 8万,c是B 7万c现在有钱。 所以,你可以一楼找到c,一楼还钱,最后得到你属于你的10万。
至此,我介绍了这篇关于Python自动化测试笔试试题精选的文章。 有关Python自动化测试笔试面试中常见编程问题的内容,请搜索聚美学院以前的文章或继续查看以下相关文章。 希望今后能支持聚米学院。