剑指offer面试题Q5~Q8 Python解

  • 这几题要么比较简单要么就是在Leetcode上刷过原题的,所以就放在一起了。

Q5. 替换空格

题目描述

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

解题思路

思路一


  • 如果你用的C++的话,在替换的时候就需要考虑内存问题,因为空格只占有一个内存空间,而%20占了三个内存空间,所以需要考虑在替换的同时不会把该字符串后面的内存覆盖修改。
  • 对于python来说,一行解决

python实现代码

class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        return s.replace(' ', '%20')


Q6. 从尾到头打印链表

题目描述

输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

解题思路

思路一


  • 我们可以先遍历一遍链表从头至尾打印保存到数组中,最后逆序返回即可

python实现代码

# -*- 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
        if not listNode:
            return []
        res = []
        while listNode:
            res.append(listNode.val)
            listNode = listNode.next
        return res[::-1]


Q7. 重建二叉树

题目描述

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

解题思路

思路一

递归

  • 这一题在Leetcode上也有原题
  • 根据前序遍历,我们可以知道前序数组中的第一位R必然是根节点
  • 遍历中序数组,找到R所在位置,以R为标准将中序数组分为两部分(左子树和右子树)
  • 然后对这两部分递归执行。自己画个图会更直接

python实现代码

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


Q8. 二叉树的下一个节点

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

解题思路

思路一


  • 遇到二叉树的题目,如果一下子想不出来,我的建议是动手画一个简单的图去实现一下,这样就会有比较具象的认识了。
  • 在这题里,对于给定的节点pNode,可以存在以下三种情况,需要分别讨论:

1、pNode有右子树。那么在中序遍历中它的下一个节点很容易看出是该节点右子树中的最左子节点;
2、pNode不存在右子树。如果该节点是它父节点的左子节点,那么它的下一个节点就是它的父节点;如果该节点是它父节点的右子节点,那么首先向上寻找直到有一个节点是其父节点的左子节点,那么这个节点的父节点就是pnode的下一节点

  • 依照上面的思路,代码就比较好理解了

python实现代码

# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None
class Solution:
    def GetNext(self, pNode):
        # write code here
        if not pNode:
            return None
        if pNode.right:
            pright = pNode.right
            while pright.left:
                pright = pright.left
            return pright
        while pNode.next and pNode == pNode.next.right:
            pNode = pNode.next
        return pNode.next

猜你喜欢

转载自blog.csdn.net/Kaiyuan_sjtu/article/details/87892191
Q8