剑指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]] 解题思路 其实这倒题和其他类似的题有所区别,这里是分层打印,把每层的节点值放在同一 ...
随机推荐
- Ruby attr_reader , attr_writer, attr_accessor方法
attr_reader方法------读取实例变量 attr_writer方法------改写实例变量 attr_accessor方法-----读写实例变量 class Person attr_rea ...
- windows动态磁盘导致的分区问题
上次说到由于装双系统导致我的win7启动不了了,一直以为是不是在ubuntu的安装界面点错了什么东西导致的,甚至认为是不是server的安装程序有点bug,直到今天继续折腾才发现了问题所在,跟ubun ...
- Oracle UNDO Tablespace size & Table Size
Table Space Query select SEGMENT_NAME,bytes/1024/1024,a.* from dba_segments a UNDO Table Space Size ...
- Mac下的常用终端命令与vim常用命令
因为很少用命令行,老被鄙视,所以今天记录一下常用的命令行: cd 切换工作目录 . 表示当前目录 .. 表示当前目录的上一级目录 / 根目录/目录分隔符 ./ 当前目录 ../ 回到上一级目录 ls ...
- linux 问题一 apt-get install 被 lock
问题: sudo apt-get install vim E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporari ...
- mac的日常使用总结
目录 有一个github的仓库:(强烈推荐) 不推荐的但是可以试试的一些链接: # 关于mac book的使用教程 github简直是一个宝藏,发现好多各种好玩的东西, 爱了爱了, 开源一定是未来, ...
- 本周学习总结(ng-zorro/MDN索引/读书笔记)
按钮 <button ng-button nzType="primary">Primary</button> nzType="" pri ...
- wpf 中AxShockwaveFlash重写以及屏蔽鼠标右键
在wpf中需要用到flash播放swf或者图片,需要使用 AxShockwaveFlashObjects.dll和ShockwaveFlashObjects.dll 在项目中使用的时候遇到 问题1.使 ...
- BZOJ4653(区间离散化+线段树+决策单调尺取)
写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除.然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按 ...
- java容器章节总结