本期題目概覽
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,點擊[閱讀原文]查看。
談風月之餘談技術