劍指offer 3-6題 12.26
阿新 • • 發佈:2019-01-05
""" Created on Wed Dec 26 18:48:22 2018 3.從尾到頭列印連結串列 **題目:**輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 **思路:**正向列印,然後翻轉 """ class Listcode: def __init__(self,x): self.val=x self.next=None class Solution: def printListFromTailToHead(self,listNode): result=[] p=listNode while p: result.append(p.val) p=p.next return result[::-1] if __name__=='__main__': A1=Listcode(1) A2=Listcode(2) A3=Listcode(3) A4=Listcode(4) A5=Listcode(5) A1.next=A2 A2.next=A3 A3.next=A4 A4.next=A5 solution=Solution() ans=solution.printListFromTailToHead(A1) print(ans) #轉自:https://blog.csdn.net/XiaoYi_Eric/article/details/81452014
""" 4.重建二叉樹 **題目:**輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。 假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}, 則重建二叉樹並返回。 **題解:**首先前序遍歷的第一個元素為二叉樹的根結點, 那麼便能夠在中序遍歷之中找到根節點,那麼在根結點左側則是左子樹, 假設長度為M.在根結點右側,便是右子樹,假設長度為N。 然後在前序遍歷根節點後面M長度的便是左子樹的前序遍歷序列, 再後面的N個長度便是右子樹的後序遍歷的長度。 """ class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: # 返回構造的TreeNode根節點 def reConstructBinaryTree(self, pre, tin): # write code here if len(pre)==0: return None if len(pre)==1: return TreeNode(pre[0]) else: flag=TreeNode(pre[0]) flag.left=self.reConstructBinaryTree(pre[1:tin.index(pre[0])+1],tin[:tin.index(pre[0])]) flag.right=self.reConstructBinaryTree(pre[tin.index(pre[0])+1:],tin[tin.index(pre[0])+1:]) return flag if __name__=='__main__': solution=Solution() pre=list(map(int,input().split(','))) tin=list(map(int,input().split(','))) ans=solution.reConstructBinaryTree(pre,tin) print(ans.val)
""" 5.用兩個棧實現佇列 **題目:**用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 **題解:**申請兩個棧Stack1和Stack2,Stack1當作輸入, Stack2當作pop。當Stack2空的時候,將Stack1進行反轉,並且輸入到Stack2。 來源:CSDN 原文:https://blog.csdn.net/XiaoYi_Eric/article/details/81452014 """ class Solution: def __init__(self): self.Stack1=[] #用列表作為棧 self.Stack2=[] def push(self, node): # write code here self.Stack1.append(node) def pop(self): # return xx if self.Stack2==[]: while self.Stack1: self.Stack2.append(self.Stack1.pop()) return self.Stack2.pop() return self.Stack2.pop() #這時棧2佇列的資料出對的順序,若棧2不空,則可以直接出隊 if __name__=='__main__': solution = Solution() solution.push(1) solution.push(2) solution.push(3) print(solution.pop())
"""
6.旋轉陣列的最小數字
**題目:**把一個數組最開始的若干個元素搬到陣列的末尾,
我們稱之為陣列的旋轉。輸入一個非減排序的陣列的一個旋轉,
輸出旋轉陣列的最小元素。例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,
該陣列的最小值為1。NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。
**題解:**遍歷陣列尋找陣列最小值。
"""
class Solution:
def minNumberInRotateArray(self, rotateArray):
#因為陣列為非減的,所以找最小值
if not rotateArray:
return 0
for i in range(1,len(rotateArray)):
if rotateArray[i]<rotateArray[i-1]:
return rotateArray[i]
return 0
if __name__=='__main__':
solution=Solution()
rotateArray=[3,4,5,1,2]
ans=solution.minNumberInRotateArray(rotateArray)
print(ans)