《剑指offer》python答案整理(1)

来源:互联网 发布:淘宝联盟如何一店多购 编辑:程序博客网 时间:2024/05/22 04:30

1. 二维数组查找

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

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

解析:二维数组行、列分别有序,可以借鉴类似分半查找的思路。可以从二维数组的左下角或者右上角开始查找。假设从右上角开始查找,若数组值大于目标值,需向数值减小的方向查找,既向左查找;若数组值小于目标值,需要向数值增大的方向查找。


2. 替换空格

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

# -*- coding:utf-8 -*-class Solution:    # s 源字符串    def replaceSpace(self, s):        # write code here        lenofl1 = len(s)        blank=0        s=list(s)        for i in range(0, lenofl1):            if s[i] == ' ':                blank +=1        lenofl2 = lenofl1 + 2*blank                for i in range(0, lenofl2-lenofl1):            s.append('')        index1 = lenofl1-1        index2 = lenofl2-1        while index1>=0 and index2>index1:            if s[index1] == ' ':                s[index2] = '0'                index2 -= 1                s[index2] = '2'                index2 -= 1                s[index2] = '%'                index2 -= 1            else:                s[index2] = s[index1]                index2 -= 1            index1 -= 1        return ''.join(s)

解析:该问题可以用python的字符串方法解决 str.replace(' ', '%20')。用更原始的方法解决解决,首先计算原始字符串的长度,根据原始字符串中空格的长度计算替换后的字符串长度。注意python中字符串是不可变类型,为了方便进行索引操作,把字符串转换为列表。分别从原始字符串末尾位置和补充后字符串末尾位置向前遍历,如果为空格,则替换,否则复制原字符,最后返回字符串。这里之所以要从后向前,是因为从前向后写入‘%20’三个字符会覆盖原字符串后面的内容。当然也可以不在原列表上进行操作,从前向后遍历原列表,在空列表上用append()方法加入相应字符元素。


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=[]        while listNode:            l.append(listNode.val)            listNode = listNode.next        l.reverse()        return l
解析:简单的将链表依次加入到列表中,然后用列表的reverse()可以实现功能。这道题还可以考虑用栈,先入后出,完成逆序打印。或者递归,先判断该节点的后继不为空,调用递归,然后打印该节点的值。


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        val = pre[0]        for i in range(0, len(tin)):            if tin[i] == val:                break        root = TreeNode(val)        root.left = self.reConstructBinaryTree(pre[1:1+i], tin[:i])        root.right = self.reConstructBinaryTree(pre[1+i:], tin[i+1:])        return root


解析:前序遍历的结果里的第一个结点是树的根节点{1},进而根据中序遍历结果知道根节点的左子树为中序遍历{4,7,2},右子树中序遍历为{5,3,8,6},而根节点的左右子树前序遍历也得到了{2,4,7}{3,5,6,8}。采用递归找到左右子树的根节点就重构了二叉树。

原创粉丝点击