剑指Offer-python实现(六)

结语:

也算是刷完了这套题,很是惭愧,其中关于二叉树部分和运用递归部分的问题多有参考别人高赞答案的思路。不过这也算是发现了问题,之后继续努力。


56. 删除链表中重复的结点
又可以当词频统计……

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def deleteDuplication(self, pHead):
        pres = []
        res = []
        while pHead:
            pres.append(pHead.val)
            pHead = pHead.next
        for i in pres:
            if pres.count(i) == 1:
                res.append(i)
        pre = dummy = ListNode(0)
        for i in res:
            node = ListNode(i)
            pre.next = node
            pre = pre.next
        return dummy.next

57. 二叉树的下一个结点
如果该节点有右子树,返回该右子树的最左叶子节点,如果没有右子树,则看它的父节点是不是祖父结点的左结点,如果是则返回祖父节点,如果不是则上溯祖父节点的父节点……直到找到祖先结点是左子树的结点,如果找不到则返回None

# -*- coding:utf-8 -*-
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None
class Solution:
    def GetNext(self, pNode):
        # write code here
        if not pNode:
            return pNode
        if pNode.right:
            left=pNode.right
            while left.left:
                   left=left.left
            return left
        while pNode.next:
            if pNode.next.left==pNode:
                return pNode.next
            pNode=pNode.next

58. 对称的二叉树
对称的意思就是左子树的左边等于右子树的右边and左子树的右边等于右子树的左边

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def isSymmetrical(self, pRoot):
        # write code here
        def is_same(p1,p2):
            if not p1 and not p2:
                return True
            if (p1 and p2) and p1.val==p2.val:
                return is_same(p1.left,p2.right) and is_same(p1.right,p2.left)
            return False
        if not pRoot:
            return True
        if pRoot.left and not pRoot.right:
            return False
        if not pRoot.left and pRoot.right:
            return False
        return is_same(pRoot.left,pRoot.right)

59. 按之字形顺序打印二叉树
牛客网太坑了给的函数名是isSymmetrical但判题是调用的是Print

class Solution:
    def __init__(self):
        self.an = []
        `isSymmetrical`#给的函数名有问题
    def Print(self, pRoot):
        # write code here
        if pRoot == None:
            return []
        return self.h([pRoot], False)

    def h(self, a, flag):
        if a == []:
            return self.an
        b, c = [], []
        for i in a:
            b.append(i.val)
            if i.left:
                c.append(i.left)
            if i.right:
                c.append(i.right)
        if flag:
            b.reverse()
        self.an.append(b)
        return self.h(c, ~flag)

60. 把二叉树打印成多行
和上一题同样的解法

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def __init__(self):
        self.an = []

    def Print(self, pRoot):
        # write code here
        if pRoot == None:
            return []
        return self.h([pRoot])

    def h(self, a):
        if a == []:
            return self.an
        b, c = [], []
        for i in a:
            b.append(i.val)
            if i.left:
                c.append(i.left)
            if i.right:
                c.append(i.right)
        self.an.append(b)
        return self.h(c)

61. 序列化二叉树

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Serialize(self, root):
        if not root:
            return '#'
        res = str(root.val)
        res += '_' + self.Serialize(root.left)
        res += '_' + self.Serialize(root.right)
        return res
        # write code here
    def Deserialize(self, s):
        lst = s.split('_')
        def des():
            if not lst:
                return None
            v = lst.pop(0)
            if v == '#':
                return None
            else:
                head = TreeNode(int(v))
                head.left = des()
                head.right = des()
            return head
        return des()

62. 二叉搜索树的第K小个结点
中序遍历取第K个值

class Solution:
    # 返回对应节点TreeNode
    def KthNode(self, pRoot, k):
        # write code here
        if not pRoot or k<1:
            return None
        buf=[]
        if len(self.inorder(pRoot,buf))<k:
            return None
        return self.inorder(pRoot,buf)[k-1]
          
    def inorder(self,pRoot,buf):
        if not pRoot:
            return None
        self.inorder(pRoot.left,buf)
        buf.append(pRoot)
        self.inorder(pRoot.right,buf)
        return buf

63. 数据流中的中位数
牛客网给的def GetMedian(self):但是判题的时候会多一个参数def GetMedian(self,n):
以及 偷懒了 ヘ( _ . _ヘ)
直接用sort()方法排序了

class Solution:
    data = []
    def Insert(self, num):
        self.data.append(num)
        self.data.sort()
        return self.data
          
    def GetMedian(self,n):
        l = len(self.data)
        if l%2==0:
            return (self.data[l/2]+self.data[l/2 - 1])/2.0
        else:
            return self.data[l/2]

64.滑动窗口的最大值

# -*- coding:utf-8 -*-
class Solution:
    def maxInWindows(self, num, size):
        # write code here
        if not num or not size:
            return []
        res = []
        start = 0
        end = size
        while end <= len(num):
            res.append(max(num[start:end]))
            start+=1
            end+=1
        return res

65. 矩阵中的路径
用递归思路求解,判断当前字符的上下左右中是否有路径中的下一个字符

# -*- coding:utf-8 -*-
class Solution:
    def hasPath(self, matrix, rows, cols, path):
        # write code here
        for i in range(rows):
            for j in range(cols):
                if matrix[i*cols+j] == path[0]:
                    if self.find(list(matrix),rows,cols,path[1:],i,j):
                        return True
        return False
    def find(self,matrix,rows,cols,path,i,j):
        if not path:
            return True
        matrix[i*cols+j]='0'
        if j+1<cols and matrix[i*cols+j+1]==path[0]:
            return self.find(matrix,rows,cols,path[1:],i,j+1)
        elif j-1>=0 and matrix[i*cols+j-1]==path[0]:
            return self.find(matrix,rows,cols,path[1:],i,j-1)
        elif i+1<rows and matrix[(i+1)*cols+j]==path[0]:
            return self.find(matrix,rows,cols,path[1:],i+1,j)
        elif i-1>=0 and matrix[(i-1)*cols+j]==path[0]:
            return self.find(matrix,rows,cols,path[1:],i-1,j)
        else:
            return False

66. 机器人的运动范围
核心思路:
1.从(0,0)开始走,判断当前节点是否为标准节点。

1.当前节点标记为0
2.节点在矩阵范围内

  1. 每成功一步标记当前位置为1,然后从当前位置往四个方向走,回到第一步
# -*- coding:utf-8 -*-
class Solution:
    def movingCount(self, threshold, rows, cols):
        # write code here
        board = [[0 for _ in range(cols)] for _ in range(rows)]
        def block(r,c):
            s = sum(map(int,str(r)+str(c)))
            return s>threshold
        class Context:
            acc = 0
        def traverse(r,c):
            if not (0<=r<rows and 0<=c<cols):
                return
            if board[r][c]!=0: 
                return
            if board[r][c]==-1 or block(r,c):
                board[r][c]=-1
                return
            board[r][c] = 1
            Context.acc+=1
            traverse(r+1,c)
            traverse(r-1,c)
            traverse(r,c+1)
            traverse(r,c-1)
        traverse(0,0)
        return Context.acc
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容