剑指Offer(Python)
014-链表中倒数第k个结点
用快慢指针:p2比p1先走k-1(1到k:间隔了k-1)步,然后再一起走,当p2为最后一个时,p1就为倒数第k个数
class ListNode:
def __init__(self, x):
self.val = x
self.next = None class Solution:
def FindKthToTail(self, head, k):
if not head or k<=0: return None
p1 = head
p2 = head
#设置两个指针,p2指针先走(k-1)步,然后再一起走
while (k-1)>0:
if (p2.next != None):
p2 = p2.next
k -= 1
else:
return None
while (p2.next != None): # 等同while p2.next:
p1 = p1.next
p2 = p2.next
return p1
015-反转链表(链表转化赋值)
思路:变化node.next
假设翻转1->2->3->4->5,(54321)
重要:
- 1.构建辅助节点head
- 2.我们将p的next指向tp的next
- 3.将tp的next指向head的next
- 4.将head的next指向tp
class ListNode:
def __init__(self, x):
self.val = x
self.next = None class Solution:
# 新链表的表头,不是head,是head.next
def ReverseList(self, pHead):
if not pHead:return None
#构建辅助节点head
head = ListNode(0)
head.next = pHead
p = pHead
while p.next != None:
#链表节点转化操作(重要)
tp = p.next
p.next = tp.next
tp.next = head.next
head.next = tp
return head.next
016-合并有序链表
思路:
新开个链表,两节点值比较,按大小存储即可
注意:head 与 pHead
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def Merge(self, pHead1, pHead2):
if (not pHead1) and (not pHead2):return None
pHead = ListNode(0)
head = pHead
while pHead1 and pHead2:
if pHead1.val > pHead2.val:
pHead.next = pHead2
pHead2 = pHead2.next
else:
pHead.next = pHead1
pHead1 = pHead1.next
#注意:pHead也得移动到下一个
pHead = pHead.next
#注意:接收剩下得pHead1的所有值,不需要一个个去判断了(链表)
if pHead1:
pHead.next = pHead1
if pHead2:
pHead.next = pHead2
#注意:pHead已经移动了,所有是head.next
return head.next
017-树的子结构:
class Solution:
def HasSubtree(self, pRoot1, pRoot2):
#(ps:我们约定空树不是任意一个树的子结构)
if not pRoot1 or not pRoot2:return None
flag = False
#找到 A中与B根节点 相同的节点,判断接下来后续点
if pRoot1.val == pRoot2.val:
flag = self.DoseTreeAhasTreeB(pRoot1,pRoot2)
#如果没找到,继续遍历左,右子树,查找与B根节点 相同的节点
if not flag:
#if pRoot1.val != pRoot2.val:
flag = self.HasSubtree(pRoot1.left,pRoot2)
if not flag:
#if pRoot1.val != pRoot2.val:
flag = self.HasSubtree(pRoot1.right,pRoot2)
return flag # 需要注意的地方是: 前两个if语句不可以颠倒顺序
def DoseTreeAhasTreeB(self,pRoot1,pRoot2):
#如果B中节点遍历完了,A没完,说明B是A的子树
if not pRoot2:
return True
#如果B没遍历完,A遍历完了:说明B不是A的子树
if not pRoot1:
return False
#(都没遍历完)如果当前节点相同,继续遍历左右节点
if pRoot1.val == pRoot2.val:
return self.DoseTreeAhasTreeB(pRoot1.left,pRoot2.left) and self.DoseTreeAhasTreeB(pRoot1.right,pRoot2.right)
else:
return False
018-二叉树的镜像:
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Mirror(self, root):
if not root:return None
#左右交换:
node = root.left
root.left = root.right
root.right =node
#对左右节点递归
self.Mirror(root.left)
self.Mirror(root.right)
#返回根节点
return root
019-顺时针打印矩阵:
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
res = []
startX,startY,endX,endY = 0,0,len(matrix[0])-1,len(matrix)-1
while (startX <= endX and startY <= endY):
#1:
i1 = startX
while(i1 <= endX):
res.append(matrix[startY][i1])
i1 += 1
#2:
if endY > startY:
i2 = startY + 1
while(i2 <= endY):
res.append(matrix[i2][endX])
i2 += 1
#3:
if (endY > startY and endX > startX):
i3 = endX - 1
while(i3 >= startX):
res.append(matrix[endY][i3])
i3 -= 1
#4:
if (endY > startY+1 and endX > startX):
i4 = endY - 1
while(i4 >= startY + 1):
res.append(matrix[i4][startX])
i4 -= 1
startX += 1
startY += 1
endX -= 1
endY -= 1
return res
020-包含min函数的栈
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = [] #辅助栈 def push(self, node):
min = self.min()
if not self.stack2 or node < min:
self.stack2.append(node)
else:
self.stack2.append(min)
self.stack1.append(node) def pop(self):
if self.stack2:
self.stack2.pop(-1)
return self.stack1.pop(-1) def top(self): #返回栈顶元素
if self.stack1:
return self.stack1[-1] def min(self):
if self.stack2:
return self.stack2[-1]
021-栈的压入、弹出序列
class Solution:
def IsPopOrder(self, pushV, popV):
stack=[] #辅助栈
while popV:
# pushV,stack存在的情况下
# 如果第一个元素相等,直接都弹出,根本不用压入stack
if pushV and popV[0]==pushV[0]:
popV.pop(0)
pushV.pop(0)
#如果stack的最后一个元素与popV中第一个元素相等,将两个元素都弹出
elif stack and stack[-1]==popV[0]:
stack.pop()
popV.pop(0)
# 如果pushV中有数据,压入stack
elif pushV:
stack.append(pushV.pop(0))
# 上面情况都不满足,直接返回false。
else:
return False
return True
022-从上往下打印二叉树
# 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 []
queue = []
res = [] #保存val
queue.append(root) #队列存储二叉树根节点
while queue:
node = queue.pop(0)
res.append(node.val)
#从左到右:队列存储二叉树左右节点
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return res
023-二叉搜索树(BST)的后序遍历序列:
class Solution:
def VerifySquenceOfBST(self, sequence):
if not sequence:return False
#1.找到根节点:
root = sequence[-1]
#2.切分左右子树:找到右子树的第一个节点
for i in range(len(sequence)): #i的使用
if sequence[i] > root:
break
#3.判断是否为右子树:每个值都大于根
for j in range(i,len(sequence)):
if sequence[j] < root:
return False
#4.递归左,右子树
left = True
if i> 0:
left = self.VerifySquenceOfBST(sequence[0:i])
right = True
if i < len(sequence)-1:
#不包括最后一个值(根节点)
right = self.VerifySquenceOfBST(sequence[i:-1])
return left and right
024-二叉树中和为某一值的路径
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def FindPath(self, root, expectNumber):
def subFindPath(root):
if root:
path.append(root.val)
#1.判断和是否相等,且该节点是否是叶节点
if not root.right and not root.left and sum(path) == expectNumber:
res.append(path[:])
#2.如果不是看它的左右节点
else:
subFindPath(root.left),subFindPath(root.right)
#!3.重点:回溯法
path.pop()
res, path = [], []
subFindPath(root)
return res
剑指Offer(Python)的更多相关文章
- 剑指offer——python【第54题】字符流中第一个不重复的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- 剑指offer——python【第38题】二叉树的深度
题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 解题思路 想了很久..首先本渣渣就不太理解递归在python中的实现 ...
- 剑指offer——python【第28题】数组 中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指offer——python【第43题】左旋转字符串
题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...
- 剑指offer——python【第44题】翻转单词顺序
题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“student ...
- 剑指offer——python【第21题】栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- 剑指offer——python【第16题】合并两个有序链表
题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-& ...
- 剑指offer——python【第2题】替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”. 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 理解 很容易想到用pytho ...
- 剑指offer——python【第59题】按之子形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 这道题其实是分层打印二叉树的进阶版 ...
- 剑指offer——python【第60题】把二叉树打印成多行
题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.#类似于二维列表[[1,2],[4,5]] 解题思路 其实这倒题和其他类似的题有所区别,这里是分层打印,把每层的节点值放在同一 ...
随机推荐
- Entity Framework 实体间的外键关系
EF 默认是开户级联删除的,这此规则将会删除非空外键和多对多的关系,如果 在数据库上下文中的实体模型类 存在着 级联引用和多重删除路径,那么EF就抛出 级联引用和多重删除路径的异常. Introduc ...
- E - Alice and Bob
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- css margin边界叠加问题详谈
问题:给子元素一个margin-top值,其父元素会跟着往下走margin-top的值 一.代码展示 HTML <body> <div class="box"&g ...
- C++章节练习题
笔试宝典:http://www.bishibaodian.com/writtenCircle/lightquestionlist http://www.bishibaodian.com/written ...
- Codeforces Round #421 (Div. 2)D - Mister B and PR Shifts(模拟)
传送门 题意 给出n个数,计算在进行n-1次右移中\(min\sum_{i=1}^nabs(p_i-i)\) 分析 我们设置cnt[p[i]-i]为一个数p[i]与它标准位置(如1的标准位置为1)的左 ...
- Java中JRE、JDK和JVM的区别
一.三者的基本概念: JRE(Java Development Kit):Java的运行环境: JDK(Java Runtime Enviroment):Java开发工具包: JVM(Java Vir ...
- CI框架错误汇总
2017年1月13日12:09:02 [1] A PHP Error was encounteredSeverity: NoticeMessage: Undefined variable: aticl ...
- websocket实现群聊
server # @File: 群聊 from flask import Flask, render_template, request from geventwebsocket.handler im ...
- _bzoj1096 [ZJOI2007]仓库建设【斜率优化dp】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 又是一道经典斜率优化. #include <cstdio> const i ...
- Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
Bryce1010模板 http://codeforces.com/problemset/problem/1000/C 题意:问你从[l,r]区间的被多少条线覆盖,列出所有答案. 思路:类似括号匹配的 ...