1. 程式人生 > 其它 >測試面試 | Python 演算法與資料結構面試題系列二(附答案)

測試面試 | Python 演算法與資料結構面試題系列二(附答案)

⬇️ 點選“下方連結”,提升測試核心競爭力!

>>更多技術文章分享和免費資料領取原文連結
關注@霍格沃茲測試學院公眾號,回覆「面試」,領取BAT大廠測試面試真題專輯。1.排序實現有一組“+”和“-”符號,要求將“+”排到左邊,“-”排到右邊,寫出具體的實現方法。答:如果讓+等於0,-等於1不就是排序了麼。fromcollectionsimportdequefromtimeitimportTimers="++++++----+++----"#方法一deffunc1():new_s=s.replace("+","0").replace("-","1")result="".join(sorted(new_s)).replace("0","+").replace("1","-")returnresult#方法二deffunc2():q=deque()left=q.appendleftright=q.appendforiins:ifi"+":left("+")elifi

"-":right("-")#方法三deffunc3():data=list(s)start_index=0end_index=0count=len(s)whilestart_index+end_indexcount:ifdata[start_index]=='-':data[start_index],data[count-end_index-1]=data[count-end_index-1],data[start_index]end_index+=1else:start_index+=1return"".join(data)if__name__=='__main__':timer1=Timer("func1()","from__main__importfunc1")print("func1",timer1.timeit(1000000))timer2=Timer("func2()","from__main__importfunc2")print("func2",timer2.timeit(1000000))timer3=Timer("func3()","from__main__importfunc3")print("func3",timer3.timeit(1000000))#1000000測試結果#func11.39003764#func21.593012875#func33.3487415590000005#func1的方式最優,其次是func22.單鏈表反轉答:單鏈表反轉classNode:def__init__(self,val=None):self.val=valself.next=NoneclassSingleLinkList:def__init__(self,head=None):"""連結串列的頭部"""self._head=headdefadd(self,val:int):"""給連結串列新增元素:paramval:傳過來的數字:return:"""#建立一個節點node=Node(val)ifself._headisNone:self._head=nodeelse:cur=self._headwhilecur.nextisnotNone:cur=cur.next#移動遊標cur.next=node#如果next後面沒了證明以及到最後一個節點了deftraversal(self):ifself._headisNone:returnelse:cur=self._headwhilecurisnotNone:print(cur.val)cur=cur.nextdefsize(self):"""獲取連結串列的大小:return:"""count=0ifself._headisNone:returncountelse:cur=self._headwhilecurisnotNone:count+=1cur=cur.nextreturncountdefreverse(self):"""單鏈表反轉思路:讓cur.next先斷開即指向none,指向設定pre遊標指向斷開的元素,然後cur.next指向斷開的元素,再把開始self._head再最後一個元素的時候.:return:"""ifself._headisNoneorself.size()==1:returnelse:pre=Nonecur=self._headwhilecurisnotNone:post=cur.nextcur.next=prepre=curcur=postself._head=pre#逆向後的頭節點if__name__=='__main__':single_link=SingleLinkList()single_link.add(3)single_link.add(5)single_link.add(6)single_link.add(7)single_link.add(8)print("對連結串列進行遍歷")single_link.traversal()print(f"size:{single_link.size()}")print("對連結串列進行逆向操作之後")single_link.reverse()single_link.traversal()3.交叉連結串列求交點答:#Definitionforsingly-linkedlist.classListNode:def__init__(self,x):self.val=xself.next=NoneclassSolution:defgetIntersectionNode(self,headA,headB):""":tyehead1,head1:ListNode:rtye:ListNode"""ifheadAisnotNoneandheadBisnotNone:cur1,cur2=headA,headBwhilecur1!=cur2:cur1=cur1.nextifcur1isnotNoneelseheadAcur2=cur2.nextifcur2isnotNoneelseheadBreturncur1cur1、cur2,2個指標的初始位置是連結串列headA、headB頭結點,cur1、cur2兩個指標一直往後遍歷。直到cur1指標走到連結串列的末尾,然後cur1指向headB;直到cur2指標走到連結串列的末尾,然後cur2指向headA;然後再繼續遍歷。每次cur1、cur2指向None,則將cur1、cur2分別指向headB、headA。迴圈的次數越多,cur1、cur2的距離越接近,直到cur1等於cur2。則是兩個連結串列的相交點。4.用佇列實現棧ww**答:**下面程式碼分別使用1個佇列和2個佇列實現了棧。fromqueueimportQueue#使用2個佇列實現classMyStack:def__init__(self):"""Initializeyourdatastructurehere."""#q1作為進棧出棧,q2作為中轉站self.q1=Queue()self.q2=Queue()defpush(self,x):"""Pushelementxontostack.:typex:int:rtype:void"""self.q1.put(x)defpop(self):"""Removestheelementontopofthestackandreturnsthatelement.:rtype:int"""whileself.q1.qsize()
1:self.q2.put(self.q1.get())#將q1中除尾元素外的所有元素轉到q2中ifself.q1.qsize()1:res=self.q1.get()#彈出q1的最後一個元素self.q1,self.q2=self.q2,self.q1#交換q1,q2returnresdeftop(self):"""Getthetopelement.:rtype:int"""whileself.q1.qsize()>1:self.q2.put(self.q1.get())#將q1中除尾元素外的所有元素轉到q2中ifself.q1.qsize()1:res=self.q1.get()#彈出q1的最後一個元素self.q2.put(res)#與pop唯一不同的是需要將q1最後一個元素儲存到q2中self.q1,self.q2=self.q2,self.q1#交換q1,q2returnresdefempty(self):"""Returnswhetherthestackisempty.:rtype:bool"""returnnotbool(self.q1.qsize()+self.q2.qsize())#為空返回True,不為空返回False#使用1個佇列實現classMyStack2(object):def__init__(self):"""Initializeyourdatastructurehere."""self.sq1=Queue()defpush(self,x):"""Pushelementxontostack.:typex:int:rtype:void"""self.sq1.put(x)defpop(self):"""Removestheelementontopofthestackandreturnsthatelement.:rtype:int"""count=self.sq1.qsize()ifcount0:returnFalsewhilecount>1:x=self.sq1.get()self.sq1.put(x)count-=1returnself.sq1.get()deftop(self):"""Getthetopelement.:rtype:int"""count=self.sq1.qsize()ifcount
0:returnFalsewhilecount:x=self.sq1.get()self.sq1.put(x)count-=1returnxdefempty(self):"""Returnswhetherthestackisempty.:rtype:bool"""returnself.sq1.empty()if__name__'main':obj=MyStack2()obj.push(1)obj.push(3)obj.push(4)print(obj.pop())print(obj.pop())print(obj.pop())print(obj.empty())5.找出資料流的中位數答:對於一個升序排序的陣列,中位數為左半部分的最大值,右半部分的最小值,而左右兩部分可以是無需的,只要保證左半部分的數均小於右半部分即可。因此,左右兩半部分分別可用最大堆、最小堆實現。如果有奇數個數,則中位數放在左半部分;如果有偶數個數,則取左半部分的最大值、右邊部分的最小值之平均值。分兩種情況討論:當目前有偶數個數字時,數字先插入最小堆,然後選擇最小堆的最小值插入最大堆(第一個數字插入左半部分的最小堆)。當目前有奇數個數字時,數字先插入最大堆,然後選擇最大堆的最大值插入最小堆。最大堆:根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。最小堆:根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。#--coding:utf-8--fromheapqimport*classSolution:def__init__(self):self.maxheap=[]self.minheap=[]defInsert(self,num):if(len(self.maxheap)+len(self.minheap))&0x1:#總數為奇數插入最大堆iflen(self.minheap)>0:ifnum>self.minheap[0]:#大於最小堆裡的元素heappush(self.minheap,num)#新資料插入最小堆heappush(self.maxheap,-self.minheap[0])#最小堆中的最小插入最大堆heappop(self.minheap)else:heappush(self.maxheap,-num)else:heappush(self.maxheap,-num)else:#總數為偶數插入最小堆iflen(self.maxheap)>0:#小於最大堆裡的元素ifnum<-self.maxheap[0]:heappush(self.maxheap,-num)#新資料插入最大堆heappush(self.minheap,-self.maxheap[0])#最大堆中的最大元素插入最小堆heappop(self.maxheap)else:heappush(self.minheap,num)else:heappush(self.minheap,num)defGetMedian(self,n=None):if(len(self.maxheap)+len(self.minheap))&0x1:mid=self.minheap[0]else:mid=(self.minheap[0]-self.maxheap[0])/2.0returnmidif__name__'main':s=Solution()s.Insert(1)s.Insert(2)s.Insert(3)s.Insert(4)print(s.GetMedian())6.二叉搜尋樹中第K小的元素答:二叉搜尋樹(BinarySearchTree),又名二叉排序樹(BinarySortTree)。二叉搜尋樹是具有有以下性質的二叉樹:若左子樹不為空,則左子樹上所有節點的值均小於或等於它的根節點的值。若右子樹不為空,則右子樹上所有節點的值均大於或等於它的根節點的值。左、右子樹也分別為二叉搜尋樹。二叉搜尋樹按照中序遍歷的順序打印出來正好就是排序好的順序。所以對其遍歷一個節點就進行計數,計數達到k的時候就結束。classTreeNode:def__init__(self,x):self.val=xself.left=Noneself.right=NoneclassSolution:count=0nodeVal=0defkthSmallest(self,root,k):""":typeroot:TreeNode:typek:int:rtype:int"""self.dfs(root,k)returnself.nodeValdefdfs(self,node,k):ifnode!=None:self.dfs(node.left,k)self.count=self.count+1ifself.count==k:self.nodeVal=node.val#將該節點的左右子樹置為None,來結束遞迴,減少時間複雜度node.left=Nonenode.right=Noneself.dfs(node.right,k)

更多Python程式設計常見面試題,我們後續繼續分享,敬請關注。另,歡迎投稿參與「金羽毛」有獎徵文活動,分享2020年你的測試開發技術學習、職業生涯成長故事等精彩話題。

⬇️ 點選“下方連結”,提升測試核心競爭力!

>>更多技術文章分享和免費資料領取