劍指offer 2

本期題目概覽

chapter2

試題 7: 用兩個棧實現隊列

用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素爲int類型。

試題 8: 旋轉數組的最小數字

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

試題 9: 斐波那契數列

大家都知道斐波那契數列,現在要求輸入一個整數n,
請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。

試題 10:跳臺階

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

相關代碼

試題 7: 用兩個棧實現隊列

# -*- coding:utf-8 -*-
# 思路:注意棧和隊列的性質。
# 棧是先進後出且只能從棧頂出;隊列則爲先進先出,一般都是從隊頭出
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
        # stack1,stack2調用pop()爲python內置函數
        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()

試題 8: 旋轉數組的最小數字


# -*- coding:utf-8 -*-
# 方法1
# 遍歷給定的數組,求出最小值
# class Solution:
#   def minNumberInRotateArray(self, rotateArray):
#        # write code here
#        arrLong = len(rotateArray)
#        rever = rotateArray[0]
#        for i in range(arrLong):
#            if rotateArray[i] < rever:
#                rever = rotateArray[i]
#
#        return rever
# 方法2
# 折半查找
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        p = 0
        q = len(rotateArray) - 1
        mid = p
        while rotateArray[p] >= rotateArray[q]:
            if q - p == 1:
                mid = q
                break
            mid = int(q   p) / 2
            if rotateArray[p] <= rotateArray[mid]:
                p = mid
            elif rotateArray[q] >= rotateArray[mid]:
                q = mid
        return rotateArray[mid]

試題 9: 斐波那契數列

# -*- coding:utf-8 -*-
# from time import time
# start = time()
class Solution:
    def Fibonacci(self, n):
        if n < 2:
            return n
        item1, item2 = 0, 1
        for _ in range(2, n 1):
            ans = item1   item2
            item1, item2 = item2, ans
        return ans
# 方法 2
# 使用遞歸; 當我們試圖跟蹤執行的程序,即使是很小的參數n,都感覺頭都要炸了。
# 在這裏,我們堅持信念,假定兩個遞歸調用都可以正常工作,那麼很明顯,把他們加到一起必然可以得到正確結果

# 使用遞歸很耗時間,對時間要求嚴格的程序無法通過
# from time import time
# start = time()
# class Solution:
#
#     def Fibonacci(self, n):
#         if n == 0:
#             return 0
#         elif n == 1:
#             return 1
#         else:
#             return self.Fibonacci(n-1)   self.Fibonacci(n-2)
# print(Solution().Fibonacci(39))
# end = time()
# print(end-start)

試題 10:跳臺階


# 方法 1
# 比較傾向於找規律的解法,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5,
# 可以總結出f(n) = f(n-1)   f(n-2)的規律,但是爲什麼會出現這樣的規律呢?
# 假設現在6個臺階,我們可以從第5跳一步到6,這樣的話有多少種方案跳到5就有多少種方案跳到6,
# 另外我們也可以從4跳兩步跳到6,跳到4有多少種方案的話,就有多少種方案跳到6,其他的不能從3跳到6什麼的啦,
# 所以最後就是f(6) = f(5)   f(4);
# -*- coding:utf-8 -*-
class Solution:
    def jumpFloor(self, number):
        # write code here
        if number < 3:
            return number
        item1, item2, ans = 1, 2, 0
        for _ in range(2, number):
            ans = item1   item2
            item1, item2 = item2, ans
        return ans
# 方法 2
# 使用遞歸
# def jumpFloor(number):
#     if number == 1:
#         return 1
#     elif number ==2:
#         return 2
#     else:
#         return jumpFloor(number-1)   jumpFloor(number-2)

餘下的以及之前的題目將會陸續放到github,點擊[閱讀原文]查看。

劍指offer-github

談風月之餘談技術
qrcode_for_gh_730b1594d3c6_258.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章