《剑指offer》Java版

本文整理了《剑指offer》书中算法题的Java实现,包括数组、链表、树、多线程等主题。文章涵盖经典面试题,如查找链表倒数第k个节点、两个栈实现队列、二叉树重建等,所有代码已在OJ上验证。还提供了部分热门面试题的解题思路,如斐波那契数列、数组中查找目标值等,并给出了二叉树路径和为特定值的问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引言
《剑指offer》可谓是程序猿面试的神书了,在面试中帮了我很多,大部分面试的算法题都会遇到原题或者是类似的题。但是书上的代码都是C版的,我在这里整理了一份Java版的代码供大家学习参考,这些代码我都是在OJ上跑过全AC的,所以正确性你大可放心。

二、目录
1赋值运算函数
2单例设计模式
3二维数组中查找目标值
4替换字符串中的空格
5从尾到头打印链表
6由前序和中序遍历重建二叉树
7用两个栈实现队列

8求旋转数组的最小数字
9斐波那契数列的第n项(青蛙跳台阶)
10二进制中1的个数
11数值的整数次方
12打印1到最大的n位数
13O(1)时间删除链表节点
14使数组中的奇数位于偶数前面
15找链表中倒数第K个节点
16输出反转后的链表
17合并两个有序链表
18判断二叉树A中是否包含子树B
19二叉树的镜像
20顺时针打印矩阵

21包含min函数的栈
22判断一个栈是否是另一个栈的弹出序列
23层序遍历二叉树
24后序遍历二叉搜索树
25二叉树中和为某值的路径

26复杂链表的复制
27二叉搜索树转换为双向链表
28打印字符串中所有字符的排列
29数组中出现次数超过一半的数字
30找出最小的K个数
31连续子数组的最大和

32从1到整数n中1出现的次数
33把数组中的数排成一个最小的数
34求第N个丑数
35第一个出现一次的字符
36数组中逆序对的个数
37两个链表的第一个公共节点
38数字在排序数组中出现的次数
39二叉树的深度
40数组中只出现一次的两个数,而其他数都出现两次。
41和为s的连续整数序列
42翻转字符串
43n个骰子的点数及出现的概率
44扑克牌的顺子
45圆圈中最后剩下的数
46 1+2+3+…+n的和
47不用加减乘除做加法
48不能被继承的类
49字符串转换为整数
50树中两个节点的最低公共祖先
51找出重复的数
52构建乘积数组
53正则表达式匹配
54表示数值的字符串
55字符流中第一个不重复的字符
56链表中环的入口节点
57删除链表中重复的节点
58二叉树的下一个节点
59对称的二叉树
60按之字形顺序打印二叉树

61把二叉树打印成多行
62序列化二叉树
63二叉搜索树的第K个节点
64数据流中的中位数
65滑动窗口的最大值
66矩阵中的路径
67机器人的运动范围
注:加粗字体的题目是热门面试题。

三、代码实现
1-10题
11-20题
21-30题
31-40题
41-50题
51-67题
GitHub地址:https://github.com/GaoLeiQin/SwordOffer

四、PDF下载
免费下载网址:《剑指Offer》题目、思路及Java版代码(带目录修订版)
————————————————
版权声明:本文为优快云博主「白夜行515」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/baiye_xing/article/details/78428561

2 单例

https://blog.youkuaiyun.com/kris1025/article/details/104657059?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159399348919195239805004%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159399348919195239805004&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v1~rank_blog_v1-3-104657059.pc_v1_rank_blog_v1&utm_term=%E5%8D%95%E4%BE%8B

静态内部类实现单例
public class SingletonPattern {

    private SingletonPattern() {
    }

    private static class SingletonPatternHolder {
        private static final SingletonPattern singletonPattern = new SingletonPattern();
    }

    public static SingletonPattern getInstance() {
        return SingletonPatternHolder.singletonPattern;
    }
}

数组

3 二维数组中查找目标值
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路:从右上角或左下角开始找,逐行删除,或者用二分法查找

    public boolean find(int[][] array,int target) {
        if (array == null) {
            return false;
        }
        int row = 0;
        int column = array[0].length-1;

        while (row < array.length && column >= 0) {
            if(array[row][column] == target) {
                return true;
            }
            if(array[row][column] > target) {
                column--;
            } else {
                row++;
            }
        }
        return false;
    }

9.1 斐波拉齐数列第n 项
9.2.一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路 :9.2和9.1 解法相同 使用非递归的解法(动态规划),效率上来说也会比递归好很多,不仅仅是因为递归会使得栈的深度变得很大,而且在递归的过程中,求解 getNums(n - 1) + getNums(n - 2) 时,在不同的 n 值下,还会产生很多重复的计算。而非递归的方式仅仅只是获取到之前的值使用,不存在重复的计算消耗。

// 1 递归

    
    public static int getFibonacci(int n) {
        if (n <= 1) return n;
        return getNums(n - 1) + getNums(n - 2);
    }
 

// 2 动态规划 循环
    public static int getFibonacci(int n) {
        if (n <= 1) return n;
        // 使用一个长度为 2 的数组存储前两位的值
        int[] nums = new int[] { 0, 1 };
        int result = 0;
        for (int i = 2; i <= n; i++) {
            result = nums[0] + nums[1];
            nums[0] = nums[1];
            nums[1] = result;
        }
        return result;
    }

//    
 public long fibonacci(int n) {
        long result=0;
        long preOne=1;
        long preTwo=0;
        if(n==0) {
            return preTwo;
        }
        if(n==1) {
            return preOne;
        }
        for (int i = 2; i <= n; i++) {
            result = preOne+preTwo;
            preTwo = preOne;
            preOne = result;
        }
        return result;
    }

9.3 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路:斐波那契数列思想

    public int Fibonaccik(int n) {
        int number = 1;
        int sum = 1;
        if (n <= 0)
            return 0;
        if (n == 1 ) {
            return 1;
        }

        while (n-- >= 2) {
            sum += number;
            number = sum - number;
        }
        return sum;
    }

9.4一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:2^(n-1)

代码实现:

    public int JumpFloor2(int target) {
        return (int) Math.pow(2,target-1);
    }

14使数组中的奇数位于偶数前面

	// 解法一:移动偶数位置,时间复杂度 O(n²),空间复杂度 O(1)
    public void reOrderArray(int[] array) {
        if (array == null || array.length == 0) {
            return ;
        }

        for (int i = 1; i < array.length; i++) {
            int
### 回答1: 《剑指offer JavaPDF》是一本广受欢迎的面试算法题解答指南。这本书主要针对求职者准备技术面试,特别是Java语言相关的职位。这本书不仅仅提供了问题解析,还包含了详细的答案和清晰的思路。这使得读者能够更好地理解问题,并掌握解决问题的技巧。 这本书采用了PDF格式,具有易于阅读和携带性强的优点。读者可以将其存储在电脑、手机或平板电脑中,随时随地学习和复习。这为读者提供了极大的便利。 《剑指offer JavaPDF》不仅仅是一个算法题解答指南,还包含了一些求职技巧和面试准备建议。这些内容帮助读者了解面试流程、优化简历、提高面试技巧等,并提供了一些建议来克服可能的挑战。这些经验和建议对求职者来说非常有价值,能够帮助他们在面试中更加出色地表现。 总的来说,《剑指offer JavaPDF》是一本实用的书籍,对于准备技术面试的求职者来说,是一份宝贵的资料。无论是对于算法题的解析,还是对于求职技巧的培养,这本书都能提供很多帮助。如果你是一个Java语言的求职者,我强烈建议你阅读这本书,它将为你的面试准备带来很大的帮助。 ### 回答2: 剑指Offer是一本非常经典的面试刷题指南,它包含了很多常见的编程面试题目,并提供了详细的解答和解题思路。剑指Offer JavaPDF则是将这本书中的题目和解答都用Java语言实现,并以PDF文档的形式呈现出来。 这本Java剑指Offer PDF非常有用,特别适合正在准备面试的程序员。它将面试题目按照不同的难度级别进行了分类,并提供了相应的解答和解题思路。这样可以帮助程序员更好地了解面试官考察的重点和思考问题的方式,提高自己解题的能力。 此外,这本Java剑指Offer PDF还提供了一些常见的算法和数据结构的实现,帮助程序员更好地理解和掌握这些基础知识。通过阅读和实践这些题目,程序员可以提高自己的编程能力和解决问题的能力,为日后的面试做好充分准备。 总的来说,剑指Offer JavaPDF是一本非常实用的面试刷题指南,它以Java语言实现了原书中的题目和解答,并提供了详细的解题思路。它对于准备面试的程序员来说是一本非常有价值的参考书籍,能够帮助他们提高解题能力,更好地应对面试挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值