目錄
一 CODING
1 可以解決
- 斐波那契數列,遞歸解法、非遞歸解法, 時間複雜度分析 參考
解答:
遞歸解法:通俗地想,時間複雜度爲,若使用組合數學解二階常係數差分方程,時間複雜度爲
非遞歸解法(循環解法):時間複雜度爲
矩陣快速冪解法:時間複雜度 - 兩個鏈表求交點
思路:兩個指針分別遍歷兩個鏈表,a+b+c = c+b+a,這時會相遇 - 快速排序
思路:數組首元素取爲軸值,左右指針向中間遍歷,先右再左 - 有一個數組,求平均
思路:一個一個加,再除以總數 - 逆序字符串
思路:https://www.cnblogs.com/jwcz/p/11760508.html
2 需要再看
- 一個未排序整數數組,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序。例:
input: 1,7,-5,9,-12,15 ,ans: -5,-12,1,7,9,15 。且要求時間複雜度O(N),空間O(1)
思路:想不出來O(n)的
參考
參考 - 1到100求和,要給出自己算法的時間複雜度,並寫出logn時間複雜度的寫法
思路:想不出來 - 不用循環不用庫,找出數組的最大值
思路:遞歸方法找最大值 - 循環遞增數組插入數
思路:向此類基本有序的數組插入元素,插入排序效果比較好;或者二分法也可。 - 給n個連續自然數,中間抽取一個,亂序構成數組,求抽取的那個數
思路:找n個連續的自然數中消失的數,利用索引的對應關係
3 完全不會
- kmp算法
算法思想:創建next數組,next數組保存的是pattern字符串各個最長公共前綴的長度。 - 迴文字符串(leetcode 647)
- 最長迴文字符串(leetcode 5)
思路1):暴力判斷,對每個子串判斷是否迴文 - 判斷字符串是否迴文(leetcode 125)
思路1) 字符串倒過來,1個1個判斷
2)頭尾指針判斷 - 數組全排列,選出比當前數大的值
- 出了一道編程題,給定ip,url,time等參數,去重獲取其中一天,某一時間段的日誌ip信息(採用了set方法,time和logging模塊)好像面試官不是很滿意; 後來想想可以用linux查logger文件,ls-ld獲取某天全部日誌信息,再py去重。
- 手撕字符串比較
二 系統設計
1 大量數據+內存不夠時的排序方法:
- 100萬個整數+10M內存排序
- 10G數字排序
思路:分塊,每塊排序;多路歸併排序。
2 大量數據+topK
- 從100億隨機數中找到前100萬個最大的數
- 10萬個整數找十個最大的
思路:
- 找TopK個最大的數,維護一個大小爲K的小根堆,堆頂爲K個元素中最小的數。若第K+1個元素比堆頂小或等於,則pass;若第K+1個元素 比堆頂大,則放入堆中,彈出原來的堆頂。
- TopK個最小的數,維護一個大小爲K的大根堆
- 如果K過大,無法裝入內存。可以先對100億隨機數做哈希分流,分流到小文件,每個文件維護一個小根堆。再進行外排序。
3 中位數
- 10萬個整數找找中位數,內存不受限;
思路:雙堆,維護一個大根堆,一個小根堆
4 詞頻統計
- 給你一個文本,統計文本中詞頻最高的詞,輸出這個高頻詞和這個詞出現的次數
思路:詞頻統計,哈希表,倒排索引?
1)數據預處理,得到只包含單詞的文本
2) map操作,得到一堆詞頻爲1的(單詞,1)
3) reduce操作,hadoop。
三 工程
1python 中 list和set的區別,集合其他相關,時間複雜度等等
解答:
1)list:列表,長度可變的數組,有序的,通過下標訪問,訪問時不能越界。list是以數組array的形式進行存儲的,然後數組中每一個元素其實存儲的是列表對象的指針(指針元素的內存id地址是連續的)。參考
2) dict: 字典,存儲鍵值對結構,無序,key爲可hash的對象。(可hash的對象,python的內置不可變類型,自己定義的類(帶有__hash__魔法函數))
3) set: 集合,存儲的也是鍵值對結構,無序。
4) dict和set都基於hash表實現,CPython使用僞隨機探測(pseudo-random probing)的散列表(hash table)作爲字典的底層數據結構。python2中解決has衝突:開放尋址法。解決hash衝突的辦法
5) dict中如何查找指定的key? 在dict中查找指定的key時,會先計算key的散列值,然後使用散列值的一部分來定位表元,如果沒有找到相應的表元,則說明dict中不存在對應的key跑出KeyError異常。如果找到表元之後,會判斷表元中的key是否和要查找的key相等,相等就返回對應值,如果不相等則使用其對應的散列值的其他部分來定位散列表中的其他行。(這是因爲不同的對象通過的散列值有一定的概率相同,這也是爲什麼在存放dict時開闢內存時候需要有1/3的空地址出來,這樣如果有相同的hash值就會有空的地址來存放隨數據增加,還會繼續開闢新的內存,以確保空內存時刻在1/3左右)
6) set的元素爲key-value的key。表元只包含鍵的引用,而沒有對值的引用。
7) dict的存儲順序和元素的添加順序有關。添加的數據有可能改變已有的數據順序(擴容時,需要將原來的dict,複製移動到新的內存空間,此時將“擠出”已有的“空”,所以每個key的偏移可能改變)
8) 同一個dict中的所有key的id在內存中是連續的,並且其數據的存儲方式爲hash表的形式
9) dict使用hashtable內存的開銷更大。爲了保證較少的衝突,hashtable的裝載因子,一般要小於0.75,在python中當裝載因子達到2/3的時候就會自動進行擴容。
10) 性能比較
dict和set: 獲取元素(查找元素是否存在):O(1); 插入刪除 O(1); 遍歷: O(n)
list: 獲取元素:O(n);插入append O(1) insert O(n); 刪除 pop() O(1) ,pop(n) O(n), del O(n)
2 讀取目錄下的ppt文件,給出測試用例
假設目錄爲/root/,shell命令爲
find /root/ -name "*.ppt"
測試用例:
單元測試參考
參考
https://testerhome.com/topics/11461
https://www.cnblogs.com/limxiaosi/p/6003185.html
https://blog.csdn.net/BearStarX/article/details/81303854
3 查找目錄下所有文件並按文件大小排序
du -sh * | sort -nr
四 概率/數學等
- 64匹馬比賽,8個賽道,最少多少次比賽決出前4名。(約束條件:不知道每匹馬的具體成績;且馬發揮穩定)
思路:10場或者11場。
轉化爲64個數的排序問題,一次可以比8個數,問比多少次可以找到前4個最小的數。參考
1.1 類似問題:25匹馬,5條賽道,找出最快的5匹。
思路:8場。參考
1.2 64 匹馬,8 個賽道,最少多少次比賽對所有馬進行排序。
思路:37場。參考
1.3 36 個賽車,6 個跑道,最少多少次找出前3.
思路:8場。參考
五 聊人生
https://www.cnblogs.com/hogwarts/p/11376137.html
http://www.51testing.com/html/60/n-4464360.html
- 介紹一下你的項目,項目難點?
- 有什麼要問的?
- 爲什麼研究生階段學的算法,現在要做測試開發?爲什麼做測試開發?
思路: - 你的人生規劃是什麼?
- 自動化測試是什麼?
- 測試工具瞭解哪些?
- 你有什麼缺點?
思路:1. 不太會拒絕朋友的要求。2. 做事情考慮的不夠長遠,過於單純。
- https://blog.csdn.net/qq_41841073/article/details/82889982
- https://blog.csdn.net/m0_37717595/article/details/81407963
整合研發測試流程:JIRA、禪道
把需求管理、接口管理、開發測試環境維護、版本管理、缺陷管理、自動化測試執行、性能測試全部串起來;享受開源測試工具的便利時,正是由一些測試開發貢獻的,如 airtest、httpRunner、uiautomator2等
測試工具、測試平臺開發;這類開發工作主要服務於“測試”相關業務,本質與開發公司其它產品業務並沒有什麼不同。
自動化測試開發:UI自動化測試、接口自動化測試和單元測試等
測試腳本的開發:這類工作主要是服務於一般測試工作,提高測試效率,例如通過測試腳本生成測試數據、抓取頁面數據進行對比等
測試人員會更深入介入開發工作,通過“測試左移”,提前與開發人員一起制定測試計劃,推動代碼評審、代碼審計、單元測試、自動化冒煙測試、測試精準化分析以及研發自測等來保證研發階段的質量;
另外,測試人員會也會參與配置部署,將自動化測試用例配置到持續交付鏈中,並通過“測試右移”,全流程監控發佈後的應用質量。
“測試左移”,也就是指的研發階段的質量保證,“測試右移”也就是發佈後的質量監控
每一次的改動,我們都要去做迴歸的,而這種迴歸,在這種短時間迭代越來越短的節奏下,其實已經沒有辦法再靠人力去支撐了,到時候必然就會帶來測試工程師要進行加班,而且光加班也是解決不了的問題,所以這個時候,測試的壓力是非常大的。
持續交付、持續集成、DevOps等這樣一個大的環境裏面。你所做的自動化測試,如何融入到這個體系中去,如何能快速的發現線上的問題,以及更早的發現研發級別的問題,靠原有的這些質量保證手段,其實已經有點匱乏了、
忽略了對質量體系的建設,以及測試流程的建設。
後面你們會慢慢發現,隨着devops、持續交付這一套東西的流行,測試,運維,會慢慢的去管控整個公司的質量,然後研發只需要負責寫代碼。
1.瞭解過負載均衡麼
2.用過抓包工具麼
wireShark
3.面向對象編程的三大特點:封裝、繼承、多態
4.socket網絡編程,怎樣實現長連接
5.用過什麼實用的輔助小工具
6.引用和指針的區別
7.快排的思想
8.什麼是哈希
9.多線程和多進程
10.進程間通信方式
11.死鎖的四個必要條件
3.12一面
項目相關:問到了框架的源碼,問得非常詳細!
python:python運行原理,pyc文件的內容,模式設計,多線程怎麼實現,多線程和多進程的健壯性,孤兒進程,虛擬環境,python環境配置(原理)
linux:git,庫的配置,查找文件名
mysql:mysql和redis,索引聯合查詢,mysql優化
計算機網絡:瀏覽器打開網頁的全過程,DNS服務器是誰的,網頁的渲染過程
測試:網頁一個按鈕失效怎麼定位錯誤,抓包怎麼實現的,工作在哪一層
代碼:判斷字符串是否迴文;求最長迴文子串
3.13二面
- 項目相關
- python:深拷貝,淺拷貝
- 代碼:二叉樹的非遞歸中序遍歷
- 計算機網絡七層模型分別是什麼,應用層協議有哪些
- 代碼:讀取目錄下的ppt文件,給出測試用例
- 對自動化測試有了解嗎
- 爲什麼要做測試開發
3.17三面 - 項目相關:問了機器學習相關
- 編程題:不用循環不用庫,找出數組的最大值
3.18 HR面 - 爲什麼做測開
- 之前實習的內容
- 爲什麼之前實習做前端現在轉測開
3.19 offer call