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

本文提供四道经典编程题目解决方案,包括二维数组查找、字符串空格替换、链表逆序打印及二叉树重建,每题均附带详细解析。

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 = None

class 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 = None
class 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}。采用递归找到左右子树的根节点就重构了二叉树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值