python刷剑指offer(21-40)(一刷)
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)(一刷)的更多相关文章
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...
- 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...
- python刷剑指offer(1-20)(一刷)
2019/07/28开始刷每天6题,一共66题,刷三遍,9月1号完成. 1.二维数组中的查找: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增 ...
- (python)剑指Offer(第二版)面试题14:剪绳子
题目 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少 ...
- (python)剑指Offer 面试题51:数组中重复的数字
问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...
- 剑指offer 面试40题
面试40题: 题目:最小的k个数 题:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题代码一: # -*- coding ...
- (python)剑指Offer:数组中重复的数字
问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...
- python实现剑指offer删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 用js刷剑指offer(把数组排成最小的数)
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路 对ve ...
随机推荐
- docker镜像制作Dockerfile
使用 Dockerfile 定制镜像 从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是 定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作 的 ...
- python 小兵(4)之文件操作 小问题
1.光标不对就用seek 2.文件操作方面注意不要变修改变删除,会爆出文件正在运行不能操作 3.w模式下只有开始打开的时候会清空 4.文件操作的时候用as 后面的参数进行操作,不能用文件名进行操作 5 ...
- X000101
P3879 [TJOI2010]阅读理解 考虑用 Trie 解决 #include<stdio.h> #include<bitset> #include<string.h ...
- CF1408G Clusterization Counting
首先,我们需要给一个连通块找到一个直观的合法判定解. 那么我们必须以一种直观的方式将边按照权值分开,这样才能直观地判定一个合法的组. 一个常见的方式是将边从小到大依次加入进来,那么在任意时刻图上存在的 ...
- VC 获取多个mac地址
转载请注明来源:https://www.cnblogs.com/hookjc/ #include <IPHlpApi.h>#include <iostream>#pragma ...
- C语言中的单引号和双引号的区别
首先肯定地说,二者是有区别的,不是说用谁都一样. 1.实质区别,代表的含义不同 'A'代表的是一个整数,而且这个整数对应的是编译器所采用的字符集中的字符序列对应的数值.所以'A'跟ASCII中的65意 ...
- finally块
/* finally 块: finally块的 使用前提是必须要存在try块才能使用. finally块的代码在任何情况下都会执行的,除了jvm退出的情况. finally非常适合做资源释放的工作,这 ...
- python 异常捕捉总结
Process finished with exit code -1 错误 执行代码 pycharm2020.1中手动中断程序,可是却捕捉不了中断异常,并且输出Process finished wit ...
- 简单模拟Java中反射的应用场景
有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...
- 高可用 & 七层负载均衡与四层负载均衡
内容概要 高可用 七层负载均衡 和 四层负载均衡 内容详细 一.高可用 1.什么是高可用 一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用 ...