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. mongodb中oplogsize大小设置

    1 oplogsize大小配置: 2 mongodb副本集构建的高可用方案,最少需要三个节点,一个主节点master,一个从节点slave,一个选举仲裁节点arbiter.当主节点奔溃的时候,仲裁节点 ...

  2. static关键字的一些使用

    百度百科定义static关键字 通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例.在成员的声明前面加上关键字static(静态的)就能创建 ...

  3. http中的8种请求介绍

    HTTP协议的8种请求类型介绍 HTTP协议中共定义了八种方法或者叫"动作"来表明对Request-URI指定的资源的不同操作方式,具体介绍如下: OPTIONS:返回服务器针对特 ...

  4. python 裴伯拉切数列

    裴伯拉切数列:从第三个元素开始,每个元素为该元素前面的两个元素的和. 裴伯拉切数列:0,1,1,2,3,5,8,13,21,34,55...... 求出小于n的裴伯拉切数列. def fibo(n): ...

  5. 「BalkanOI 2018 Day1」Minmaxtree

    「BalkanOI 2018 Day1」Minmaxtree 每个点都有一个最大和最小权值的限制. 然后每一个权值的限制都必须要取到. 每个点显然可以直接让他取到最大或最小权值. 可以想到每个点匹配一 ...

  6. [NOI2020]命运

    显然直接计数是不好计的,只能从 \(dp\) 这个角度来下手. 首先用最原始最直接的方法,直接在 \(dp\) 的过程中满足题目的要求. 既然问题给在一棵树上,那么必然和树脱不了关系,因此我们应该从树 ...

  7. SnapKit

    SnapKit 是 Masonry 框架的团队针对 Swift 全新开发的一套自动布局框架 官方网站:http://snapkit.io github网站:https://github.com/Sna ...

  8. nginx开发:ngx_sprintf

    格式化参数%系列,如果误用的话,轻则输出不正确,重则nginx可能core. 1. 格式: %{格式描述}{输出类型描述}{数据类型描述} 2. 数据类型描述: V:字符串,对应ngx_str_t * ...

  9. bom-setInterval

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 服务器硬件及RAID配置实践

    服务器硬件及RAID配置实践 1.RAID磁盘阵列介绍 2.创建RAID磁盘阵列 1.RAID:中文简称为独立冗余磁盘阵列 把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供 ...