1. 程式人生 > >劍指offer 3-6題 12.26

劍指offer 3-6題 12.26

"""
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)