刷题笔记【5】| 快速刷完67道剑指offer(Java版)

这篇具有很好参考价值的文章主要介绍了刷题笔记【5】| 快速刷完67道剑指offer(Java版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

刷题笔记【5】| 快速刷完67道剑指offer(Java版)

本文已收录于专栏
🌻
《刷题笔记》

前言

题目来源参考阿秀学长的刷题笔记,小戴只是把 C++的题解改成了 Java版本,并整理了其他思路,便于自己的学习~

如果解题有更好的方法,本文也会及时进行更新~

希望对你有帮助~ 一起加油哇~

🎨 1、合并两个有序链表

牛客原题链接

题目描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的

思路一(递归)

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null){
            return list2;
        }
        if(list2 == null){
            return list1;
        }
        if(list1.val < list2.val){
            list1.next = Merge(list1.next,list2);
            return list1;
        }else{
            list2.next = Merge(list1,list2.next);
            return list2;
        }
        
    }
}

思路二(双指针)

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null){
            return list2;
        }
        if(list2 == null){
            return list1;
        }
        // 创建一个头结点
        ListNode head = new ListNode(0);
        ListNode cur = head;

        while(list1!=null && list2!=null){
            if(list1.val <= list2.val){
                cur.next = list1;
                list1 = list1.next;
            }else{
                cur.next = list2;
                list2 = list2.next;
            }
            cur = cur.next;
        }

        if(list1 != null){
            cur.next = list1;
        }else{
            cur.next = list2;
        }

        return head.next;
    }
}

🎨 2、树的子结构

牛客原题链接

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路一(递归)

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1, TreeNode root2) {

        if (root1 == null || root2 == null) {
            return false;
        }

        return HasSub(root1, root2) || HasSubtree(root1.left, root2) ||
               HasSubtree(root1.right, root2);
    }

    public boolean HasSub(TreeNode root1, TreeNode root2) {
        // 不匹配的情况有很多,先找匹配的情况
        // 遍历完root2,root2为空时,说明root2的所有结点都与root1的子结构匹配上
        if (root2 == null) {
            return true;
        }

        // 不匹配的情况
        // root2不为null的时候,root1为null了,显然不匹配
        if(root1 == null){
            return false;
        } 
        // root1和root2都不为空,但是数值不同,所以不匹配
        if(root1.val != root2.val){
            return false;
        }

        // 到这里说明这个点是匹配的,继续判断左子树和右子树是否匹配
        return HasSub(root1.left,root2.left) && HasSub(root1.right,root2.right);
    }
}

🎨 3、二叉树的镜像

牛客原题链接

题目描述

操作给定的二叉树,将其变换为源二叉树的镜像

思路一(递归)

先把根节点的左右子树进行交换,再递归子树进行镜像,不断交换底下的左右节点

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return TreeNode类
     */
    public TreeNode Mirror (TreeNode pRoot) {
        // write code here
        // 空树返回
        if(pRoot == null) return null;
        // 交换
        TreeNode temp = pRoot.left;
        pRoot.left = pRoot.right;
        pRoot.right = temp;
        // 递归
        Mirror(pRoot.left);
        Mirror(pRoot.right);
        return pRoot;
    }
}

🎨 4、顺时针打印矩阵

牛客原题链接

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:

[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]

则依次打印出数字文章来源地址https://www.toymoban.com/news/detail-411070.html

[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

思路一(边界模拟法)

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       ArrayList<Integer> res = new ArrayList<>();
       if(matrix.length == 0){
        return res;
       }
       // 左边界
       int left = 0;
       // 右边界
       int right = matrix[0].length - 1;
       // 上边界
       int up = 0;
       // 下边界
       int down = matrix.length - 1;
       while(left <= right && up <= down){
            // 上边界的从左到右
            for(int i = left; i <=right; i++){
                res.add(matrix[up][i]);
            }
            up++;
            if(up > down){
                break;
            }
            // 右边界的从上到下
            for(int i = up; i <= down; i++){
                res.add(matrix[i][right]);
            }
            right--;
            if(left > right){
                break;
            }
            // 下边界的从右到左
            for(int i = right; i >= left; i--){
                res.add(matrix[down][i]);
            }
            down--;
            if(up > down){
                break;
            }
            // 左边界的从下到上
            for(int i = down; i >= up; i--){
                res.add(matrix[i][left]);
            }
            left++;
            if(left > right){
                break;
            }
       }
       return res;
    }
}

到了这里,关于刷题笔记【5】| 快速刷完67道剑指offer(Java版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode-中等】剑指 Offer 67. 把字符串转换成整数(详解)

    写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续

    2024年02月15日
    浏览(52)
  • (其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】

    难度:中等 写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可

    2024年02月09日
    浏览(57)
  • 《剑指offer》——刷题日记

    本期,给大家带来的是《剑指offer》几道题目的讲解。希望对大家有所帮助!!! 本文目录 (一)JZ36 二叉搜索树与双向链表 1、题意分析 2、思路讲解 3、代码演示 4、最终结果 (二)BM6 判断链表中是否有环 1、题意分析 2、思路讲解 3、代码演示 4、最终结果 (三)JZ23 链

    2023年04月21日
    浏览(42)
  • 【leetcode刷题】剑指offer基础版(完结)

    剑指 Offer 05. 替换空格 剑指 Offer 58 - II. 左旋转字符串 剑指 Offer 67. 把字符串转换成整数❤️ 剑指 Offer 06. 从尾到头打印链表 剑指 Offer 24. 反转链表 剑指 Offer 35. 复杂链表的复制 剑指 Offer 18. 删除链表的节点 剑指 Offer 22. 链表中倒数第k个节点 剑指 Offer 25. 合并两个排序的链表

    2024年02月09日
    浏览(47)
  • 【leetcode刷题之路】剑指Offer(3)——搜索与回溯算法

    7 搜索与回溯算法 7.1 【BFS】剑指 Offer 32 - I - 从上到下打印二叉树 https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/   这里借助队列来实现广度优先遍历,由于需要访问每一层的节点,而且这一层访问才可以访问下一层,所以可以考虑队列的先进先出,先把每一层的节

    2024年02月13日
    浏览(59)
  • python_ACM模式《剑指offer刷题》链表1

    询问面试官是否可以改变链表结构 1. 翻转链表,再遍历链表打印。 2. 想要实现先遍历后输出,即先进后出,因此可借助栈结构。 3. 可用隐式的栈结构,递归来实现。 1. 2. 3. 采用递归的思想 注意是递归到最后一个元素才开始打印 即要先写递归 后写打印代码

    2024年01月23日
    浏览(52)
  • 【leetcode刷题之路】剑指Offer(4)——分治+排序算法+动态规划

    8 分治算法 8.1 【递归】剑指 Offer 07 - 重建二叉树 https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/   前序遍历是根左右,中序遍历是左根右,这也就意味着前序遍历的第一个节点是整棵树的根节点,顺着这个节点找到它在中序遍历中的位置,即为in_root,那么in_root左边的都在左子

    2024年02月11日
    浏览(59)
  • 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_3

    当你踏入计算机科学的大门,或许会感到一片新奇而陌生的领域,尤其是对于那些非科班出身的学子而言。作为一位非科班研二学生,我深知学习的道路可能会充满挑战,让我们愿意迎接这段充满可能性的旅程。 最近,我开始了学习 《剑指Offer》 和Java编程的探索之旅。这不

    2024年02月22日
    浏览(45)
  • 是什么Java面试题PDF被Git全面封杀?刷完这套题已经拿完9个Offer!

    JAVA阻塞队列原理 Java中的阻塞队列 JVM面试题 数据库面试 数据库存储引擎lnnoDB (B+树) TokuDB ( Fractal Tree-节点带数据) MylASM Memory 数据库引擎有哪些 lnnoDB与MylSAM的区别 索引 常见索引原则有 数据库的三范式是什么 什么是Redis? Redis 与其他key-value存储有什么不同? Redis 的数据类型? 使

    2024年03月25日
    浏览(40)
  • 【快速幂】剑指 Offer 16. 数值的整数次方

    实现 pow(x, n) ,即计算 x 的 n 次幂函数(即, x n x^n x n )。不得使用库函数,同时不需要考虑大数问题。 提示: − 100.0 x 100.0 -100.0 x 100.0 − 100.0 x 100.0 − 2 31 = n = 2 31 − 1 -2^{31} = n = 2^{31}-1 − 2 31 = n = 2 31 − 1 − 1 0 4 = x n = 1 0 4 -10^4 = x^n = 10^4 − 1 0 4 = x n = 1 0 4 对于 x n x^n x n

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包