Python自動化測試筆試面試題精選
前言
隨著行業(yè)的發(fā)展,編程能力逐漸成為軟件測試從業(yè)人員的一項基本能力。因此在筆試和面試中常常會有一定量的編碼題,主要考察以下幾點(diǎn)。
- 基本編碼能力及思維邏輯
- 基本數(shù)據(jù)結(jié)構(gòu)(順序表、鏈表、隊列、棧、二叉樹)
- 基本算法(排序、查找、遞歸)及時間復(fù)雜度
除基本算法之外,筆試面試中經(jīng)常會考察以下三種思想:
- 哈希
- 遞歸
- 分治
哈希
哈希即Python中的映射類型,字典和集合,鍵值唯一,查找效率高,序列(列表、元祖、字符串)的元素查找時間復(fù)雜度是O(n),而字典和集合的查找只需要O(1)。
因此哈希在列表問題中主要有兩種作用:
去重
優(yōu)化查找效率
例題1:列表去重#
列表去重在不考慮順序的情況下可以直接使用set()轉(zhuǎn)換(轉(zhuǎn)換后會自動排序),需要保持順序可以使用字典構(gòu)建的fromkeys()方法,利用字典鍵值的唯一性去重。
不考慮順序:
l = [2,1,2,3,4,5,6,6,5,4,3,2,1] result = list(set(l)) print(result)
運(yùn)行結(jié)果:
[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)
運(yùn)行結(jié)果:
[2, 1, 3, 4, 5, 6]
例題2:分組
一串字母數(shù)字組合的字符串,找出相同的字母或數(shù)字,并按照個數(shù)排序。
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)
這里使用哈希的鍵值不重復(fù)性。當(dāng)然也可以使用python自帶的groupby函數(shù),代碼如下:
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:海量數(shù)據(jù)找出top K的數(shù)據(jù)#
對于小數(shù)據(jù)量可以使用排序+切片,而對于海量數(shù)據(jù),需要考慮服務(wù)器硬件條件。即要考慮時間效率,也要考慮內(nèi)存占用,同時還要考慮數(shù)據(jù)特征。如果大量的重復(fù)數(shù)據(jù),可以先用哈希進(jìn)行去重來降低數(shù)據(jù)量。
這里我們使用生成器生成1000萬個隨機(jī)整數(shù),求最大的1000個數(shù),生成隨機(jī)數(shù)的代碼如下:
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)
不限內(nèi)存可以直接使用set()去重+排序
start = time.time() l = list(set(l)) result = l[-k:] result.reverse() print(time.time()-start)
1000w個數(shù)據(jù)會全部讀入內(nèi)存,set后列表自動為遞增順序,使用切片取-1000到最后的即為top 1000的數(shù)
使用堆排可以節(jié)省一些內(nèi)存
start = time.time() result = heapq.nlargest(k, l) print(time.time()-start)
這里是用來Python自帶的堆排庫heapq。使用nlargest(k,l)可以取到l序列,最大的k個數(shù)。
較小內(nèi)存可以分治策略,使用多線程對數(shù)據(jù)進(jìn)行分組處理(略)
例題4:兩數(shù)之和#
l=[1,2,3,4,5,6,7,8] 數(shù)據(jù)不重復(fù),target=6,快速找出數(shù)組中兩個元素之和等于target 的數(shù)組下標(biāo)。
注意,不要使用雙重循環(huán),暴力加和來和target對比,正確的做法是單層循環(huán),然后查找target與當(dāng)前值的差,是否存在于列表中。
但是由于列表的in查詢時間復(fù)雜度是O(n),即隱含了一層循環(huán),這樣效率其實和雙重循環(huán)是一樣的,都是O(n^2)。
這里就可以使用哈希來優(yōu)化查詢差值是否在列表中操作,將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: # 在集合中查找,為避免重復(fù),判斷a為較小的那個值 result.append((list1.index(a), list1.index(b))) # 列表index取下標(biāo)的操作為O(1) print(result)
遞歸問題
遞歸是一種循環(huán)調(diào)用自身的函數(shù)。可以用于解決以下高頻問題:
- 階乘
- 斐波那切數(shù)列
- 跳臺階、變態(tài)跳臺階
- 快速排序
- 二分查找
- 二叉樹深度遍歷(前序、中序、后序)
- 求二叉樹深度
- 平衡二叉樹判斷
- 判斷兩顆樹是否相同
遞歸是一種分層推導(dǎo)解決問題的方法,是一種非常重要的解決問題的思想。遞歸可快速將問題層級化,簡單化,只需要考慮出口和每層的推導(dǎo)即可。
如階乘,要想求n!,只需要知道前一個數(shù)的階乘(n-1)!,然后乘以n即可,因此問題可以轉(zhuǎn)為求上一個數(shù)的階乘,依次向前,直到第一個數(shù)。
舉個通俗的例子:
A欠你10萬,但是他沒那么多錢,B欠A 8萬,C欠B 7萬 C現(xiàn)在有錢。因此你要逐層找到C,一層一層還錢,最后你才能拿到屬于你的10萬。
到此這篇關(guān)于Python自動化測試筆試面試題精選的文章就介紹到這了,更多相關(guān)Python自動化測試筆試面試時常見的編程題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)在某個數(shù)組中查找一個值的算法示例
今天小編就為大家分享一篇Python實現(xiàn)在某個數(shù)組中查找一個值的算法示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Pandas實現(xiàn)解析JSON數(shù)據(jù)與導(dǎo)出的示例詳解
其實使用pandas解析JSON?Dataset要方便得多,所以這篇文章主要為大家介紹了Pandas實現(xiàn)解析JSON數(shù)據(jù)與導(dǎo)出的具體方法,需要的小伙伴可以收藏一下2023-07-07YOLOv5中SPP/SPPF結(jié)構(gòu)源碼詳析(內(nèi)含注釋分析)
其實關(guān)于YOLOv5的網(wǎng)絡(luò)結(jié)構(gòu)其實網(wǎng)上相關(guān)的講解已經(jīng)有很多了,但是覺著還是有必要再給大家介紹下,下面這篇文章主要給大家介紹了關(guān)于YOLOv5中SPP/SPPF結(jié)構(gòu)源碼的相關(guān)資料,需要的朋友可以參考下2022-05-05Python3.5 Json與pickle實現(xiàn)數(shù)據(jù)序列化與反序列化操作示例
這篇文章主要介紹了Python3.5 Json與pickle實現(xiàn)數(shù)據(jù)序列化與反序列化操作,結(jié)合實例形式分析了Python3.5使用Json與pickle模塊實現(xiàn)json格式數(shù)據(jù)的序列化及反序列化操作相關(guān)步驟與注意事項,需要的朋友可以參考下2019-04-04Python實現(xiàn)將羅馬數(shù)字轉(zhuǎn)換成普通阿拉伯?dāng)?shù)字的方法
這篇文章主要介紹了Python實現(xiàn)將羅馬數(shù)字轉(zhuǎn)換成普通阿拉伯?dāng)?shù)字的方法,簡單分析了羅馬數(shù)字的構(gòu)成并結(jié)合實例形式給出了Python轉(zhuǎn)換羅馬數(shù)字為阿拉伯?dāng)?shù)字的實現(xiàn)方法,需要的朋友可以參考下2017-04-04Python的Django框架中的數(shù)據(jù)庫配置指南
這篇文章主要介紹了Python的Django框架中的數(shù)據(jù)庫配置指南,文中舉了Python內(nèi)置的SQLite的示例,需要的朋友可以參考下2015-07-07Python編程實現(xiàn)的簡單神經(jīng)網(wǎng)絡(luò)算法示例
這篇文章主要介紹了Python編程實現(xiàn)的簡單神經(jīng)網(wǎng)絡(luò)算法,結(jié)合實例形式分析了神經(jīng)網(wǎng)絡(luò)算法的原理及Python相關(guān)算法實現(xiàn)技巧,需要的朋友可以參考下2018-01-01