《剑指offer》Java版

一、引言
《剑指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版代码(带目录修订版)
————————————————
版权声明:本文为CSDN博主「白夜行515」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baiye_xing/article/details/78428561

2 单例

https://blog.csdn.net/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 ;
        }

       
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值