剑指offer(五)

剑指offer(21-25)。

栈的压入和弹出序列

题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,
请判断第二个序列是否可能为该栈的弹出顺序。
假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,
序列4,5,3,2,1是该压栈序列对应的一个弹出序列,
但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路

  1. 借用一个辅助栈

代码实现

class Solution:
    def IsPopOrder(self, pushV, popV):
        if len(pushV)!=len(popV): #如果入栈序列和弹出序列长度不一致,返回False
            return False
        stack=[]                 #创建一个辅助栈
        for i in pushV:          #循环将入栈序列的值压入辅助栈
            stack.append(i)
            while stack and stack[-1]==popV[0]: #如果辅助栈不为空并且辅助栈顶元素等于弹出序列第一个值
                stack.pop()                     #辅助栈栈顶元素出栈
                popV.pop(0)                     #弹出序列第一个值弹出
        if stack:                               #如果入栈序列循环结束,辅助栈不为空,说明弹出序列不是该栈的弹出顺序
            return False
        return True

从上往下打印二叉树

题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。

思路

  1. 其实就是二叉树的层次遍历,借用一个队列就可以实现

代码实现

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

#其实就是对二叉树进行层次遍历,借用一个队列就可以实现
class Solution:
    # 返回从上到下每个节点值列表,例:[1,2,3]
    def PrintFromTopToBottom(self, root):
        if not root:            #树为空,返回空列表
            return []
        result=[]              #存储好遍历结点值的列表
        queue=[root]           #辅助队列
        while queue:
            tmp=queue.pop(0)           #队头结点出队
            result.append(tmp.val)     #队头结点值存入列表
            if tmp.left:               #左子树非空,入队
                queue.append(tmp.left)
            if tmp.right:              #右子树非空,入队
                queue.append(tmp.right)
        return result

二叉搜索树的后序遍历序列

题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

思路

  1. 后序遍历的序列中,最后一个数字是树的根节点 ,数组中前面的数字可以分为两部分:
    第一部分是左子树节点的值都比根节点的值小,第二部分是右子树节点的值都比根节点的值大,
    后面用递归分别判断前后两部分 是否 符合以上原则

代码实现

class Solution:
    def VerifySquenceOfBST(self, sequence):
        if not sequence:                     # 如果数组为空,直接返回False
            return False
        length=len(sequence)                #数组的长度
        root=sequence[-1]                   #根节点的值
        for i in range(length):             #寻找二叉搜索树的左子树
            if sequence[i]>root:
                break
        for j in range(i,length):           #判断二叉搜索树的右子树的每一个结点的值是否都比很结点大
            if sequence[j]<root:
                return False
        left=right=True                     # 递归调用,分别查看二叉树的左右子树
        if i>0:
            left=self.VerifySquenceOfBST(sequence[0:i])
        if i<length-1 and left:
            right=self.VerifySquenceOfBST(sequence[i:-1])
        return left and right               #当左右两子树都返回 True 的时候,结果才是 True

二叉树中和为某一值的路径

题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
(注意: 在返回值的list中,数组长度大的数组靠前)

思路

  1. 递归

代码实现


class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    # 返回二维列表,内部每个列表表示找到的路径
    def FindPath(self, root, expectNumber):
        if not root:                #如果树为空,返回空列表
            return []
        result=[]
        if not root.left and not root.right and expectNumber==root.val: #节点为叶子节点且值等于给定值
            return [[root.val]]                                         #注意返回的是二维列表
        else:
            left=self.FindPath(root.left,expectNumber-root.val)         #递归查找左右子树中的路径(值要减去根节点的值)
            right=self.FindPath(root.right,expectNumber-root.val)
        for i in left+right:                                            #与根节点合并
            result.append([root.val]+i)
        return sorted(result, key=lambda x: -len(x))                    #输出按路径长度降序的列表,这里直接调用sorted函数
                                                                        #也可以自己编写一个排序函数,然后调用

复杂链表的复制

题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

思路

  1. 递归
  2. 非递归。

复制原来的链表,顺次链接成新的链表;
利用原来结点的random指向,来为复制的结点指向相应的random
将复制好的链表拆分出来,或者说将偶数位的节点重新拆分合成新的链表,得到的就是复制的链表

代码实现

class RandomListNode:
    def __init__(self, x):
        self.label = x
        self.next = None
        self.random = None
#方法一,非递归
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        if not pHead:
            return pHead

    #复制原来的链表。顺次连接成新的链表
        cloNode=pHead
        while cloNode:
            node=RandomListNode(cloNode.label)
            node.next=cloNode.next
            cloNode.next=node
            cloNode=node.next

    #利用原来结点的random指向,来为复制的结点指向相应的random
        cloNode=pHead
        while cloNode:
            node=cloNode.next
            if cloNode.random:
                node.random=cloNode.random.next
            cloNode=node.next

    #将复制好的链表拆分出来,或者说将偶数位的节点重新拆分合成新的链表,得到的就是复制的链表
        cloNode=pHead
        pHead=pHead.next              #必须执行此操作,否则最后得到的pHead就是原链表的头结点了
        while cloNode.next:
            node=cloNode.next
            cloNode.next=node.next
            cloNode=node

        return pHead

#方法二,递归
class Solution2:
    # 返回 RandomListNode
    def Clone(self, pHead):
        if not pHead:
            return None
        cloneHead = RandomListNode(pHead.label)
        cloneHead.random = pHead.random
        cloneHead.next = self.Clone(pHead.next)
        return cloneHead
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-20 16:14
已编辑
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git&nbsp;commit,不会git&nbsp;pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗?&nbsp;哪怕是一个swap函数,开源项目里都经常注释:1&nbsp;3&nbsp;5&nbsp;7&nbsp;9&nbsp;2&nbsp;4&nbsp;6&nbsp;8&nbsp;10^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1.&nbsp;部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go……&nbsp;结果满脸懵的说ts是什么……我让看agent&nbsp;loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务