Python自動化測試筆試面試題精選
前言
隨著行業的發展,程式設計能力逐漸成為軟體測試從業人員的一項基本能力。因此在筆試和麵試中常常會有一定量的編碼題,主要考察以下幾點。
- 基本編碼能力及思維邏輯
- 基本資料結構(順序表、連結串列、佇列、棧、二叉樹)
- 基本演算法(排序、查詢、遞迴)及時間複雜度
除基本演算法之外,筆試面試中經常會考察以下三種思想:
- 雜湊
- 遞迴
- 分治
雜湊
雜湊即Python中的對映型別,字典和集合,鍵值唯一,查詢效率高,序列(列表、元祖、字串)的元素查詢時間複雜度是O(n),而字典和集合的查詢只需要O(1)。
因此雜湊在列表問題中主要有兩種作用:
去重
優化查詢效率
例題1:列表去重#
列表去重在不考慮順序的情況下可以直接使用set()轉換(轉換後會自動排序),需要保持順序可以使用字典構建的fromkeys()方法,利用字典鍵值的唯一性去重。
不考慮順序:
l = [2,1,2,3,4,5,6,1] result = list(set(l)) print(result)
執行結果:
[1,6]
考慮順序:
l = [2,1] result = list({}.fromkeys(l).keys()) print(result)
執行結果:
[2,6]
例題2:分組
一串字母數字組合的字串,找出相同的字母或數字,並按照個數排序。
l = [1,'a','b','c','d',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,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,7,8] 資料不重複,target=6,快速找出陣列中兩個元素之和等於target 的陣列下標。
注意,不要使用雙重迴圈,暴力加和來和target對比,正確的做法是單層迴圈,然後查詢target與當前值的差,是否存在於列表中。
但是由於列表的in查詢時間複雜度是O(n),即隱含了一層迴圈,這樣效率其實和雙重迴圈是一樣的,都是O(n^2)。
這裡就可以使用雜湊來優化查詢差值是否在列表中操作,將O(n)降為O(1),因此總體的效率就會變成O(n^2)->O(n)。
l = [1,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,一層一層還錢,最後你才能拿到屬於你的10萬。
到此這篇關於Python自動化測試筆試面試題精選的文章就介紹到這了,更多相關Python自動化測試筆試面試時常見的程式設計題內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!