剑指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

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