本期题目概览
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
谈风月之余谈技术