剑指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]] 解题思路 其实这倒题和其他类似的题有所区别,这里是分层打印,把每层的节点值放在同一 ...
随机推荐
- 任务29:自己动手构建RequestDelegate管道
cmd创建一个控制台应用程序 dotnet new console --name MyPipeline 用VSCode打开这个项目 新建类RequestDelegate.cs的类文件复制Program ...
- NYOJ3——多边形重心问题
多边形重心问题 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述:在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接) ...
- js跳转方法整理与自动刷新
js方式的页面跳转1.window.location.href方式 <script language="JavaScript" type="text/javascr ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- Educational Codeforces Round 20 E - Roma and Poker(dp)
传送门 题意 Roma在玩一个游戏,一共玩了n局,赢则bourle+1,输则bourle-1,Roma将会在以下情况中退出 1.他赢了k个bourle 2.他输了k个bourle 现在给出一个字符串 ...
- bzoj 3676: [Apio2014]回文串【回文自动机】
回文自动机板子 或者是SAM+manacher+倍增,就是manacher求本质不同回文串(让f++的串),然后在SAM倍增查询对应点出现次数 #include<iostream> #in ...
- bzoj 2560: 串珠子【状压dp】
正难则反,设g[s]为集合s不一定联通的方案数,这个很好求,把边数+1乘起来即可,f[s]为s一定联通的方案数 f考虑容斥,就是g[s]-Σf[nw]*g[s^nw],nw是s的子集,这样就减掉了不联 ...
- P5169 xtq的异或和(FWT+线性基)
传送门 我咋感觉我学啥都是白学-- 首先可以参考一下这一题,从中我们可以知道只要知道两点间任意一条路径以及整个图里所有环的线性基,就可以得知这两个点之间的所有路径的异或和 然而我好像并不会求线性基能张 ...
- 【CodeForces - 546C】Soldier and Cards (vector或队列)
Soldier and Cards 老样子,直接上国语吧 Descriptions: 两个人打牌,从自己的手牌中抽出最上面的一张比较大小,大的一方可以拿对方的手牌以及自己打掉的手牌重新作为自己的牌, ...
- NOIp 2015真题模拟赛 By cellur925
果然我还是最菜的==不接受反驳== Day1 T1:神奇的幻方 思路:直接模拟即可,由于当前放法只与上一放法有关系,用两个变量记录一下即可.10分钟内切掉== 预计得分:100分 实际得分:100分 ...