剑指offer(数据结构篇)

来源:互联网 发布:关系数据库教程 编辑:程序博客网 时间:2024/06/05 19:50

3 数组——二维数组中的查找

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

class Solution:    # array 二维列表    def Find(self, array, target):        # 判断数组是否为空        if array == []:            return False        rawnum = len(array)        colnum = len(array[0])        # 判断非法输入        # 可以换成 isinstance(target, (int, float)) 进行判断        if type(target) == float and type(array[0][0]) == int:            target = int(target)        elif type(target) == int and type(array[0][0]) == float:            target = float(int)        elif type(target) != type(array[0][0]):     # 浮点数的相等判断问题需要特别注意, 一般都是判断两个数的差值是否小于一个特别小的数。这里不展开分析。            return False        i = colnum - 1        j = 0        while i >= 0 and j < rawnum:            if array[j][i] < target:                j += 1            elif array[j][i] > target:                i -= 1            else:                return True        return False    # 扩展, 输出数组中target的个数    def searchMatrix(self, matrix, target):        if matrix == None or len(matrix) == 0:            return 0        rows = len(matrix)        cols = len(matrix[0])        row, col = 0, cols - 1        count = 0        while row <= rows - 1 and col >= 0:            if matrix[row][col] > target:                col -= 1            elif matrix[row][col] < target:                row += 1            else:                count += 1                col -= 1        return countarray = [[1, 2, 8, 9],         [2, 4, 9, 12],         [4, 7, 10, 13],         [6, 8, 11, 15]]array2 = []array3 = [['a', 'b', 'c'],          ['b', 'c', 'd']]array4 = [[62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],[63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82],[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83],[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],[67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85]]findtarget = Solution()print(findtarget.Find(array, 10))print(findtarget.Find(array, 30))print(findtarget.Find(array, 13.0))print(findtarget.Find(array, ''))print(findtarget.Find(array2, 10))print(findtarget.Find(array3, 'b'))print(findtarget.searchMatrix(array4, 81))

4.字符串——替换空格

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

class Solution:    # s 源字符串    # 创建新的字符串进行替换    def replaceSpace1(self, s):        tempstr = ''        if type(s) != str:            return        for c in s:            if c == ' ':                tempstr += '%20'            else:                tempstr += c        return tempstr    # 简单代码替换    # 在Python中str类型是不可变的类型, 使用replace语句会生成一个新的str, 原始的s还是带空格的str变量    def replaceSpace2(self, s):        if type(s) != str:            return        return s.replace(' ', '%20')    # 书中给的思路    # 判断输入类型的时候,isinstance必须首先判断,因为如果输入为integer的话,没有len,就会直接报错    def replaceSpace3(self, s):        if not isinstance(s,str) or len(s) <= 0 or s == None:            return ""        spaceNum = 0        for i in s:            if i == " ":                spaceNum += 1        newStrLen = len(s) + spaceNum * 2        newStr = newStrLen * [None]        indexOfOriginal, indexOfNew = len(s) - 1, newStrLen - 1        while indexOfNew >= 0 and indexOfNew >= indexOfOriginal:            if s[indexOfOriginal] == ' ':                newStr[indexOfNew-2:indexOfNew+1] = ['%', '2', '0']                indexOfNew -= 3                indexOfOriginal -= 1            else:                newStr[indexOfNew] = s[indexOfOriginal]                indexOfNew -= 1                indexOfOriginal -= 1        return "".join(newStr)s = 'we are happy'test = Solution()print(test.replaceSpace1(s))print(test.replaceSpace2(s))print(test.replaceSpace3(s))

5.链表——从尾到头打印链表

class Solution:    # 返回从尾部到头部的列表值序列,例如[1,2,3]    def printListFromTailToHead(self, listNode):        newlist =[]        while listNode is not None:            newlist.append(listNode.val)            listNode = listNode.next        return newlist[::-1]node1 = ListNode(23456)node2 = ListNode(33)node3 = ListNode(456)node1.next = node2node2.next = node3singleNode = ListNode(23456)test = ListNode()S = Solution()print(S.printListFromTailToHead(node1))print(S.printListFromTailToHead(test))print(S.printListFromTailToHead(singleNode))

6.树——重建二叉树

这个比较难一点,输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

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 not pre and not tin:            return None        root = TreeNode(pre[0])        if set(pre) != set(tin):            return None        i = tin.index(pre[0])        root.left = self.reConstructBinaryTree(pre[1:i+1], tin[:i])        root.right = self.reConstructBinaryTree(pre[i+1:], tin[i+1:])        return rootpre = [1, 2, 3, 5, 6, 4]tin = [5, 3, 6, 2, 4, 1]test = Solution()newTree = test.reConstructBinaryTree(pre, tin)

7.栈和队列

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

# -*- coding:utf-8 -*-class Solution:    def __init__(self):        self.stack1 = []        self.stack2 = []    def push(self, node):        self.stack1.append(node)    def pop(self):        if len(self.stack2) == 0 and len(self.stack1) == 0:            return        elif len(self.stack2) == 0:            while len(self.stack1) > 0:                self.stack2.append(self.stack1.pop())        return self.stack2.pop()P = Solution()P.push(10)P.push(11)P.push(12)print(P.pop())P.push(13)print(P.pop())print(P.pop())print(P.pop())print(P.pop())
原创粉丝点击