美文网首页
杂七杂八啊 || 剑指offer

杂七杂八啊 || 剑指offer

作者: zilla | 来源:发表于2020-01-01 17:52 被阅读0次

時の経つのが速すぎ( ;´Д`)
不知道每天要说多少句本打算……然而……
重新学日语 & 练吉他 & 学pytorch的安排刚定下就扑街……
赶快准备2号面字节跳动后端实习……


去南京


12月30日

从南京回来了,赶啊躺尸…………我爱傻白,我爱维泽嘻嘻
继续「剑指offer」

数值的整数次方

位运算,一轮一轮手动模拟一下就明白了。思路参考自牛客上的大佬
🌰1011B的1010B次方 = (1011)的(0010)次方 * (1011)的(1000)次方

    double Power(double base, int exp) {
        long long abs_exp = abs(exp);
        double res = 1.0;
        while(abs_exp) {
            if(abs_exp & 1) res *= base; // exp & 1  取exp最低位
            base *= base; 
            abs_exp >>= 1;
        }
        return exp < 0 ? 1/res : res;
    }

链表的倒数第k个结点

快慢指针,注意处理链表本身长度小于k的情况。

    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        int i = 0;
        ListNode* p = pListHead;
        while(p && i < (int)(k)) {
            p = p->next;
            i++;
        }
        if(i != k) return NULL;
        ListNode* q = pListHead;
        while(p) {
            p = p->next, q = q->next;
        }
        return q;
    }

链表反转

没有头结点,注意边界条件。

    ListNode* ReverseList(ListNode* pHead) {
        if(!pHead) return NULL;
        ListNode *p0 = NULL, *p1 = pHead, *p2 = pHead->next;
        while(p2) {
            p1->next = p0;
            p0 = p1;
            p1 = p2;
            p2 = p2->next;
        }
        p1->next = p0;
        return p1;
    }

合并两个排序的链表

手动模拟再写。写函数调试不方便😭,写的不顺真是气嗷。
搞一个dummy node,最后输出它的next会好写很多呀。

ListNode *Merge(ListNode *pHead1, ListNode *pHead2) {
    ListNode *newhead = new ListNode(-1); //dummy node
    ListNode *p0 = newhead, *p1 = pHead1, *p2 = pHead2;
    while (p1 && p2) {
        if (p1->val < p2->val) {
            p0->next = p1;
            p1 = p1->next;
        } else {
            p0->next = p2;
            p2 = p2->next;
        }
        p0 = p0->next;
    }
    if (p1) p0->next = p1;
    else p0->next = p2;
    return newhead->next;
}

⚠️树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
这题是薄弱点QAQ,分析一下:

  • 首先,若T2是T1的子结构,遍历T1,若出现val与T2根结点权值相同的结点,check以它为根的子树“上半部分”是否和T2相同(isT1_has_T2)。若不同,继续看它的左、右子树是否能包含T2。

  • isT1_has_T2递归(边界注意空指针)

    • 若T2的每个结点都匹配了,r2空,return true
    • 若T2还未完全匹配,r1已经为空,return false
    • 以上,边界的空指针检查✅
    • 另一个边界:r1,r2的val不同,return false
    • 递归:左子树同否 && 右子树同否
bool isT1_has_T2(TreeNode *r1, TreeNode *r2) {
    if (!r2) return true;
    if (!r1) return false;
    if (r1->val != r2->val) return false;
    return isT1_has_T2(r1->left, r2->left) &&
           isT1_has_T2(r1->right, r2->right);
}

bool HasSubtree(TreeNode *pRoot1, TreeNode *pRoot2) {
    if (!pRoot1 || !pRoot2) return false;
    bool res = false;
    // DFS 
    if (pRoot1->val == pRoot2->val) {
        res = isT1_has_T2(pRoot1, pRoot2);
    }
    if (!res) res = HasSubtree(pRoot1->left, pRoot2);
    if (!res) res = HasSubtree(pRoot1->right, pRoot2);
    return res;
}

相关文章

  • 杂七杂八啊 || 剑指offer

    時の経つのが速すぎ( ;´Д`)不知道每天要说多少句本打算……然而……重新学日语 & 练吉他 & 学pytorch...

  • 全网最全剑指offer题目解答

    【剑指offer】Java版代码(完整版) 【剑指offer】1-10题 【剑指offer】11-20题 【剑指o...

  • 剑指offer 和 leetcode题目

    剑指offer leetcode

  • 单例模式

    单例模式 最近在看《剑指offer》,根据《剑指offer》的讲解,结合《effectiveJava》简单学习了一...

  • 年龄排序

    摘抄资料:《剑指offer》

  • 剑指offer

    第一题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,...

  • 《剑指offer》

    4.调整数组顺序使奇数位于偶数前面 题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇...

  • 剑指offer

    二维数组中查找数在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到...

  • 剑指offer

    剑指offer题目 1 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。...

  • 剑指offer

    1.链表反转 1、输出倒数第k个数

网友评论

      本文标题:杂七杂八啊 || 剑指offer

      本文链接:https://www.haomeiwen.com/subject/aqyeoctx.html