剑指offer练习Python(一)

来源:互联网 发布:淘宝太宅太闹空姐代购 编辑:程序博客网 时间:2024/06/13 23:17

http://blog.csdn.net/u011274209/article/details/60486240

(1)二维数组中的查找

        在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

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

(2)替换空格

          请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

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


(3)从尾到头打印链表

          输入一个链表,从尾到头打印链表每个节点的值。

# -*- coding:utf-8 -*-# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:    # 返回从尾部到头部的列表值序列,例如[1,2,3]    def printListFromTailToHead(self, listNode):        # write code here        l = []        head = listNode        while head:            l.insert(0, head.val)            head = head.next        return l


(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 = Noneclass Solution:    # 返回构造的TreeNode根节点    def reConstructBinaryTree(self, pre, tin):        # write code here        if len(pre) == 0:            return None        count = 0        for i in tin:            if i == pre[0]:            tn = TreeNode(pre[0])                tn.left = self.reConstructBinaryTree(pre[1:count + 1],tin[0:count])                tn.right = self.reConstructBinaryTree(pre[count + 1:len(pre)],tin[count+1:len(tin)])                return tn            count += 1

(5)用两个栈实现队列

          用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

# -*- 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):        if len(self.stack2) == 0:            while len(self.stack1) != 0:                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。

# -*- coding:utf-8 -*-class Solution:    def minNumberInRotateArray(self, rotateArray):        # write code here        pre = 0        for i in rotateArray:            if i < pre :                return i            pre = i
(7)斐波那契数列

         大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

# -*- coding:utf-8 -*-class Solution:    def Fibonacci(self, n):        # write code here        array = [1, 1]        if n == 0:        return 0        n = n - 1        i = 2        while i <= n:            array.append(array[i - 1] + array[i - 2])            i += 1        return array[n]
(8)跳台阶

         一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

# -*- coding:utf-8 -*-class Solution:    def jumpFloor(self, number):        # write code here        array = [1, 2]        number = number - 1        i = 2        while i <= number:            array.append(array[i - 1] + array[i - 2])            i += 1        return array[number]
(9)变态跳台阶

         一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

# -*- coding:utf-8 -*-class Solution:    def jumpFloorII(self, number):        # write code here        if number == 0 or number == 1:            return 1        else:            return 2 * self.jumpFloorII(number - 1)
(10)矩形覆盖

           我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

# -*- coding:utf-8 -*-class Solution:    def rectCover(self, number):        # write code here        if number==0:            return 0        a = 1        b = 1        for i in range(number):            a, b = b, a + b        return a
(11)二进制中1的个数

           输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

# -*- coding:utf-8 -*-class Solution:    def NumberOf1(self, n):        # write code here        return sum([(n>>i & 1) for i in range(0,32)])



0 0
原创粉丝点击