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

# 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。
# 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
# 1.建立一个辅助栈,将栈的压入序列压入到辅助栈中
# 2.压入一个元素就与弹出序列进行比较,如果辅助栈顶元素与弹出序列相等就弹出
# 3.最后判断辅助栈元素是否被完全弹出,如果完全弹出了返回true,否则返回FALSE; # 特殊情况
if not pushV or len(pushV) != len(popV):
return False stack = []
# 1.建立一个辅助栈,将栈的压入序列压入到辅助栈中
for ele in pushV:
stack.append(ele)
# 2.压入一个元素就与弹出序列进行比较,如果辅助栈顶元素与弹出序列相等就弹出
while len(stack) and stack[-1] == popV[0]: # 注意:这里是pop()对应前面的append()
stack.pop() popV.pop(0)
if len(stack):
return False
return True

22、从上往下打印出二叉树的每个节点,同层节点从左至右打印。

# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
# write code here
# 广度优先遍历
# 创建一个队列(先进先出),用于保存树节点
queue_ = [root]
# 列表用于保存每个节点值
list_ = []
if not root:
return []
while queue_:
node = queue_.pop(0)
list_.append(node.val)
# 依次遍历左右节点
if node.left:
queue_.append(node.left)
# 注意:这里要用if,不能用if elif
if node.right:
queue_.append(node.right)
return list_

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

# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
# 后序遍历 的序列中,最后一个数字是树的根节点 ,数组中前面的数字可以分为两部分:
# 第一部分是左子树节点 的值,都比根节点的值小;
# 第二部分 是右子树 节点的值,都比 根 节点 的值大,后面用递归分别判断前后两部分 是否 符合以上原则 # 特殊的
if sequence == None or len(sequence) == 0:
return False # 1、找到根节点
length = len(sequence)
root = sequence[length - 1] # 找到数组中小于根节点的值,左子树
for i in range(length):
if sequence[i] > root:
# 跳出循环,此时i已经保存
break # 找到数组中大于根节点的值,右子树
for j in range(i, length):
if sequence[j] < root:
return False # 递归:判定节点的左/右 子树是否为二叉树
left = True
if i > 0:
left = self.VerifySquenceOfBST(sequence[0:i]) right = True
if i < length - 1:
right = self.VerifySquenceOfBST(sequence[i:-1]) return left and right

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

# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def FindPath(self, root, expectNumber):
# write code here
# 输入为空树时,返回空列表
if not root:
return []
# 到达叶子节点,并且叶子节点的值符合最后需要的那一个值,则返回该路径
if not root.left and not root.right and root.val == expectNumber:
return [[root.val]]
# 非叶子节点时,如果当前节点值小于需要值,则继续遍历
if root.val < expectNumber:
# 遍历结果为左右子树遍历结果的集合
x = self.FindPath(root.left, expectNumber - root.val) + self.FindPath(root.right, expectNumber - root.val)
# 如果有结果则加上本节点并且对结果长度一次排序,否则返回空列表
# return [[root.val, ] + each for each in x] if x else []
return sorted([[root.val, ] + each for each in x], key = lambda x: len(x), reverse=True) if x else []
# 非叶子节点时,如果当前节点值已经超过需要的数,则提前结束该分支的遍历
else:
return []

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

# -*- coding:utf-8 -*-
# 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 None # 复制头结点
dummy = pHead # 1. 把复制的结点链接在原始链表的每一对应结点后面
while dummy:
dummynext = dummy.next
# 每次循环新建一个节点(复制)
copynode = RandomListNode(dummy.label)
# 复制节点指向原结点的下一个结点
copynode.next = dummynext
# 原结点指向复制结点,完成插入
dummy.next = copynode
# 继续遍历下一对结点
dummy = dummynext # 将dummy继续指向头结点
dummy = pHead # 2. 把复制的结点的random指针指向被复制结点的random指针的下一个结点
while dummy:
# 得到原结点指向的随机结点
dummyrandom = dummy.random
# 得到原结点指向的复制结点
copynode = dummy.next
if dummyrandom:
# 令复制结点的随机结点,指向原结点指向的随机结点的下一个结点
copynode.random = dummyrandom.next
# 进行下一组
dummy = copynode.next # 3. 拆分成两个链表,奇数位置为原链表,偶数位置为复制链表,
# 注意复制链表的最后一个结点的next指针不能跟原链表指向同一个空结点None,
# next指针要重新赋值None(判定程序会认定你没有完成复制)
# 将dummy继续指向头结点
dummy = pHead
# 将最终要返回的复制头结点,指向原头结点的下一个结点
copyHead = pHead.next
# 开始拆分
while dummy:
# 得到复制结点
copyNode = dummy.next
# 得到原结点的原下一个结点
dummynext = copyNode.next
# 将原结点指向原下一个结点
dummy.next = dummynext
if dummynext:
# 复制结点指向它应该指向的
copyNode.next = dummynext.next
else:
copyNode.next = None
# 进行下一组
dummy = dummynext # 返回复制后的头结点
return copyHead

python刷剑指offer(21-40)(一刷)的更多相关文章

  1. 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...

  2. 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...

  3. python刷剑指offer(1-20)(一刷)

    2019/07/28开始刷每天6题,一共66题,刷三遍,9月1号完成. 1.二维数组中的查找: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增 ...

  4. (python)剑指Offer(第二版)面试题14:剪绳子

    题目 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少 ...

  5. (python)剑指Offer 面试题51:数组中重复的数字

    问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...

  6. 剑指offer 面试40题

    面试40题: 题目:最小的k个数 题:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题代码一: # -*- coding ...

  7. (python)剑指Offer:数组中重复的数字

    问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...

  8. python实现剑指offer删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  9. 用js刷剑指offer(把数组排成最小的数)

    题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路 对ve ...

随机推荐

  1. 源码安装 python3.7

    yum install libffi-devel openssl -y wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz ta ...

  2. kubernetes之手动部署k8s 1.14.1高可用集群

    1. 架构信息 系统版本:CentOS 7.6 内核:3.10.0-957.el7.x86_64 Kubernetes: v1.14.1 Docker-ce: 18.09.5 推荐硬件配置:4核8G ...

  3. PyCharm专业版破解教程

    破解步骤: 1. 下载激活包和注册码:https://pan.baidu.com/s/1_1nrQdTElf4aEg8vGnMTzg 2. 将下载的破解包放入PyCham安装目录的bin文件夹中 3. ...

  4. Understanding C++ Modules In C++20 (1)

    Compiling evironment: linux (ubuntu 16.04)+ gcc-10.2. The Post will clarify and discuss what modules ...

  5. maven中profiles使用详解

    使用的场景 常常遇到一些项目中多环境切换的问题.比如在开发过程中用到开发环境,在测试中使用测试环境,在生产中用生产环境的情况.springboot中提供了 spring.profile.active的 ...

  6. js判断变量是否为空字符串、null、undefined

    let _isEmpty = (input) => { return input + '' === 'null' || input + '' === 'undefined' || input.t ...

  7. Python概述 —变量及运算符

    Python概述-变量及运算符 1.变量的构成 2.变量的类型 3.内存模型 4.变量命名规则 5. 算数与逻辑运算符 6.位运算符 #变量的构成 变量名:方便查找 变量值:实际要存储的内容 变量类型 ...

  8. JavaGuide--Java篇

    本文避免重复造轮子,也是从JavaGuider中提取出来方便日后查阅的手册 参考链接: JavaGuider:https://javaguide.cn/java/basis/java-basic-qu ...

  9. python小白记录二 ——自动化测试selenium中配置浏览器

    1.根据不同的浏览器 下载不同的驱动,下面是谷歌的驱动 下载地址:ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)     ...

  10. 框架4--NFS网络共享

    目录 框架4--NFS网络共享 1.练习 2.昨日问题 3.今日内容 4.NFS简介 5.NFS应用 6.NFS实践 6.1.服务端 6.2.客户端 7.NFS配置详解 8.搭建考试系统 8.1.搭建 ...