剑指offer小结第一波

       最近在做剑指offer,平时事比较多,疏于及时总结,故抽点时间对近来所做题目做个大致回顾。

面试题3:数组中重复的数字

这道题的特殊之处在于长度为n,所有数字在n-1这个范围。

解法一:将输入的数组排序:

先排序,排好序的数组中找第一个重复的数很容易,排序的时间复杂度为O(nlogn)

解法二:利用哈希表解决:

O(1)的查询时间复杂度背后需要O(n)的哈希表空间复杂度做支撑

解法三:空间复杂度也为O(1)的解法

充分应用本题的特殊之处,若无重复数字,则排序后,数字i 出现在下标为i的位置
注意,这种方法修改了原来数组中的元素位置,如果不允许修改,则考虑开辟辅助空间。书中还提到了一种避免开辟额外空间的二分查找方法,个人感觉意义不大,不能保证找出所有重复的数字。

Ying的解法:

充分利用python中列表结构提供的便利,遍历数组,找到第一个出现次数不为1的元素。

    def duplicate(self, numbers, duplication):
        # write code here
        ll = len(numbers)
        for i in numbers:
            if numbers.count(i)>1:
                duplication[0]=i
                return True
        return False

面试题四: 二维数组中的查找

技巧:

选择右上角或左下角元素作为比较标定点,可以缩小查找范围

面试题五:空格替换

题目来源于URL参数中含有特殊字符时需要转换为服务器可识别字符的应用场景。
先遍历一遍,看有多少个空格,计算转换之后的总长度,然后从后往前走,遇到空格做修改,空间复杂度为O(1)

面试题六:从尾到头打印链表

技巧:本质上将是先进后出,考虑用栈,遍历链表,将链表元素入栈,然后再让栈中元素出栈,作为新的链表元素,进而也可以考虑 用递归,访问每个链表节点时,递归地先输出下一个节点元素,然后再输出当前节点。

Ying的解法:

class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        # write code here
        li = []
        while True:
            if listNode is None:
                break
            else:
                li.append(listNode.val)
                listNode = listNode.next
        li.reverse()
        return li

面试题七:重建二叉树

根据先序中序或中序后序构建二叉树。先序遍历第一个位置是根节点,中序遍历根节点左右分别是左右子树,根据这个做递归

Ying的解法:

finding函数是在先序遍历和中序遍历发你别找到根节点的做右子树序列
reConstructBinaryTree则是递归建树的过程

class Solution:
    # 返回构造的TreeNode根节点
    def finding(self,pre,tin):
        p=tin.index(pre[0])
        left1=pre[1:p+1]
        left2=tin[:p]
        right1=pre[p+1:]
        right2=tin[p+1:]
        return left1,left2,right1,right2
    
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if len(pre)==0:
            return None
        tn = TreeNode(pre[0])
        if len(pre)==1:
            return tn
        left1,left2,right1,right2 = self.finding(pre,tin)
        if len(left1)>=1:
            tn.left = self.reConstructBinaryTree(left1,left2)
        if len(right1)>=1:
            tn.right = self.reConstructBinaryTree(right1,right2)
        return tn

面试题八:二叉树的下一个节点

中序遍历的下一个节点的确定需要考虑以下几种情况:

  1. 若当前节点有右子树,则下一个节点是它右子树中的最左子节点;
  2. 若没有右子树,若当前节点是其父节点的左孩子,则下一个节点是其父节点;若当前节点是其父节点的右孩子,则下一个节点是其一直往上遍历且是其父节点的左孩子。

Ying的解法:

class Solution:
    def GetNext(self, pNode):
        # write code here
        #普通情况,有右子节点
        if pNode.right is not None:
            pNode = pNode.right
            while pNode.left is not None:
                pNode = pNode.left
        # 没有右子树的情况
        else:
            if pNode.next is None:  # 根节点
                pNode = None
            elif pNode == pNode.next.left:  # 是父节点的左孩子
                pNode = pNode.next
            elif pNode == pNode.next.right: # 是父节点的右孩子
                pNode = pNode.next
                while pNode.next is not None and pNode.next.right == pNode:
                    pNode = pNode.next
                if pNode.next is None:
                    pNode = None
                else:
                    pNode = pNode.next
            
        return pNode

碎碎念

  • C/C++中每个字符串都以字符'\0'作为结尾,常量字符串在内存中只有一个拷贝,指向同一常量字符串的变量具有同一个地址。
  • 链表:创建、插入节点、删除节点等操作都只需要20行左右的代码就能实现,链表是一种动态的数据结构,需要对指针进行操作,注意,题目所给的pHead是只想指针的指针。同二叉树一样,都是考察的重点。
  • 二叉树三种遍历方式的实现都可以基于递归和循环做实现。
  • 二叉搜索树中找到一个节点的时间复杂度是O(logn).
  • 堆分为最大堆和最小堆,堆排序应用。
  • 红黑树是把树中节点定义为红黑两种颜色,通过规则确保从根节点到叶节点的最长路径不超过最短路径的两倍。很多数据结构是基于红黑树实现的,例如C++的STL中,set,multiset,map,multimap等。

作者原创,欢迎交流,如需转载请先联系作者。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容