1. 程式人生 > >劍指offer Python2版

劍指offer Python2版

1. 二維陣列中的查詢

在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

# -*- coding:utf-8 -*-
class Solution:
    # array 二維列表
    def Find(self, target, array):
        # write code here
        row = 0
        col = len(array[0])-1
        while(row >=0 and row <len(array) and col >= 0 and col < len(array[0])):
            if array[row][col] > target:
                col -= 1
            elif array[row][col] < target:
                row += 1
            else:
                return True
        return False

2. 替換空格

題目描述 請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。

# -*- coding:utf-8 -*-
class Solution:
    # s 源字串
    def replaceSpace(self, s):
        # write code here
        s = s.replace(" ", "%20")
        return s

3. 從頭到尾列印連結串列

題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # 返回從尾部到頭部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        # write code here
        res = []
        while(listNode):
            res.append(listNode.val)
            listNode = listNode.next
        #return res[::-1]  
        res.reverse()
        return res

4.重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

# -*- coding:utf-8 -*-
# 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
        root = TreeNode(pre[0])  #前序的第一個為根
        pos = tin.index(pre[0])   #中序找到根的位置
        root.left = self.reConstructBinaryTree(pre[1:pos+1], tin[:pos+1])
        root.right = self.reConstructBinaryTree(pre[pos+1:], tin[pos+1:])
        return root

5. 用兩個棧實現一個佇列

題目描述 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        #用lsit 來定義棧 push append   pop list.pop() 預設pop最後一個
        self.stack1 = [] 
        self.stack2 = []
    def push(self, node):
        # write code here
        self.stack1.append(node)
    def pop(self):
        # return xx
        if self.stack2:
            return self.stack2.pop()
        else:
            while(self.stack1):
                self.stack2.append(self.stack1.pop())
            return self.stack2.pop()
        

6. 旋轉陣列的最小數字

題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。

連結:https://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba 來源:牛客網 mid = low + (high - low)/2 需要考慮三種情況: (1)array[mid] > array[high]: 出現這種情況的array類似[3,4,5,6,0,1,2],此時最小數字一定在mid的右邊。 low = mid + 1 (2)array[mid] == array[high]: 出現這種情況的array類似 [1,0,1,1,1] 或者[1,1,1,0,1],此時最小數字不好判斷在mid左邊 還是右邊,這時只好一個一個試 , high = high - 1 (3)array[mid] < array[high]: 出現這種情況的array類似[2,2,3,4,5,6,6],此時最小數字一定就是array[mid]或者在mid的左 邊。因為右邊必然都是遞增的。 high = mid 注意這裡有個坑:如果待查詢的範圍最後只剩兩個數,那麼mid 一定會指向下標靠前的數字 比如 array = [4,6] array[low] = 4 ;array[mid] = 4 ; array[high] = 6 ; 如果high = mid - 1,就會產生錯誤, 因此high = mid 但情形(1)中low = mid + 1就不會錯誤

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        if len(rotateArray)==0:
            return 0
        l = 0
        r = len(rotateArray)-1
        while(l<r):
            mid = l + (r-l)/2
            if rotateArray[mid] > rotateArray[r]:
                l = mid + 1
            elif rotateArray[mid] == rotateArray[r]:
                r = r -1
            else:
                r = mid
        return  rotateArray[l]
            

7. 斐波那契數列

題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        # write code here
        if n==0:
            return 0
        if n==1:
            return 1
        f0 = 0
        f1 = 1
        for i in range(n-1):
            f = f0 + f1
            f0 = f1
            f1 = f 
        return f

8 .跳臺階

題目描述 一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloor(self, number):
        # write code here
        #f1 = 1 f2 = 2 
        if number == 0:
            return 0
        if number == 1:
            return 1
        f0 = 0 
        f1 = 1
        for i in range(number):
            f = f0 + f1
            f0 = f1
            f1 = f
        return f 

9. 變態跳臺階

題目描述 一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        #f0 = 0 f1 = 1 f2 = 2 f3 = 4
        if number == 0:
            return 0
        res = 1
        for i in range(number-1):
            res *=2
        return res 

10. 矩形覆蓋

題目描述 我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法? 在這裡插入圖片描述

# -*- coding:utf-8 -*-
class Solution:
    def rectCover(self, number):
        # write code here
        #f1 = 1 f2 =2 f3 = 3
        if number == 0:
            return 0
        if number == 1:
            return 1
        f0 = 0 
        f1 = 1
        for i in range(number):
            f = f0 + f1
            f0 = f1
            f1 = f
        return f