剑指offer题解系列
剑指offer题解系列,使用Java语言解读剑指offer全书题目。
kai-power
努力成为一名技术人!
展开
-
16.数值的整数次方
16.数值的整数次方题目:实现函数double power(double base, int exponent).思路:我们这里要考虑的是特殊情况的处理,例如,底数为负数,指数为负数的情况。代码public class DoublePower { public static void main(String[] args) { System.out.println(power2(-2, 2)); System.out.println(power2(-2, -2原创 2021-03-10 20:44:55 · 170 阅读 · 1 评论 -
15.二进制中1的个数
15.二进制中1的个数题目:实现一个函数,输入一个樟树,输出该数二进制表示中1的个数。例如,输入9,9的二进制表示为1001,有2个1,我们输出2。思路:1.按位与上1,然后右移,直到为0.2.按位与1,左移1,直到与的结果为03.原数减去1与上自身,直到自身为0代码public class CountNoOne { public static void main(String[] args) { int n = 9; System.out.print原创 2021-03-10 20:30:54 · 130 阅读 · 0 评论 -
14.剪绳子
剪绳子题目:给你一根长度为n的绳子,请把绳子剪成m段,m和n都是整数,n>1且m>1,每段绳子的长度记为k[0],k[1],……,k[m]。请问k[0]×k[1]×……×k[m]可能的最大乘积是多少?例如,绳子长度为18,分为2,3,3的三段,此时最大乘积为18。解题思路:首先我们有两种方法解决这个问题。1.动态规划动态规划的核心思想本质是递归,我们只要找到合适的入口就可以了。针对这道题,我们可以首先将其数字化:首先,我们在剪第一刀的时候我们会有n-1个选择,即剪出1,2,3……,n-原创 2021-03-10 20:14:02 · 210 阅读 · 1 评论 -
13.机器人运动的范围
13.机器人运动的范围题目:地上有一个m行n列的格子,机器人从(0,0)开始走,每次可以上下左右移动,但是不能进入数位之和大于k的格子。比如k为11,格子坐标是(29,1),那么2+9+1=12,大于11,所以他不能进入该格子,问机器人可以走多少个格子?解题思路:路径问题,直接想到回溯法!直接上代码!public class RobotMoveRange { public static void main(String[] args) { //数字不能大于18原创 2021-02-27 18:22:17 · 141 阅读 · 0 评论 -
12.矩阵中的路径
12.矩阵中的路径题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串的所有字符的路径。路径可以从矩阵中的任意格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一个,那么该路径不能再次进入该格子。回溯法思路:在某一个步骤有n个选择,我们选择其中一个满足题目约束条件的方案;如果不满足约束条件,我们就回溯到它的上一个节点;如果上一个节点所有的选项都已经试过,并且不能达到满足约束条件的终结状态,则再回溯到上一个节点;如果所有的节点都试过但依旧不能满足题目约束条件,则该原创 2021-02-27 17:04:48 · 98 阅读 · 0 评论 -
11.旋转数组的最小数字
11.旋转数组的最小数字题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素,例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。查找最值的问题,一般都可以使用遍历法,时间复杂度为O(n)O(n)O(n)。class solution1{ public int minInReverseList(int[] array) { if (array == null || array.lengt原创 2021-02-18 23:00:04 · 71 阅读 · 0 评论 -
10.斐波那契数列
10.斐波那契数列题目:求斐波那契数列的第n项。思路一:直接递归。缺陷明显,效率低下,有较多重复的求解,求第10项,需要第9和第8项,而第9项需要第7项和第8项,第8项需要第7项和第6项,这样一来就重复计算了很多项。class solution1{ public long fibonacci(int n) { if(n <= 0) return 0; if(n == 1) return 1; return fibonacci(n-1) + fibonacci(n-2); }}原创 2021-02-14 23:53:31 · 320 阅读 · 0 评论 -
9.用两个栈实现队列
9.用两个栈实现队列题目:用两个栈实现一个队列。解题思路:一个栈用来压入元素,而另一个栈作为缓冲,将第一个栈的元素出栈后压入第二个栈。class solution{ private Stack<Integer> stack1 = new Stack<>(); private Stack<Integer> stack2 = new Stack<>(); public int pop() throw Exception { if (stack1.i原创 2021-02-14 23:21:01 · 84 阅读 · 0 评论 -
8.二叉树的下一个节点
8.二叉树的下一个节点题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右节点的指针,还有一个指向父节点的指针。首先分析题目,在图中二叉树的中序遍历序列是{d,b,h,e,i,a,f,c,g},以上述的例子作为参考,分析这道题的解法。情况一:如果一个节点有右子树,那么他的下一个节点就是他的右子树中的最左节点,也即是从右子节点开始,向左子节点寻找,就可以找到下一个节点。图中的b的下一个节点是h,节点a的下一个节点为f。情况二:如果一个节点没有右子原创 2021-02-14 23:07:27 · 147 阅读 · 0 评论 -
7.重建二叉树
7.重建二叉树题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},重建其二叉树并返回其根节点。首先说明一下二叉树的前序遍历:前序遍历序列中,第一个数字总是根节点的值。中序遍历:根节点的值在序列的中间,左子树的节点位于根节点的值的左边,而右子树的值位于根节点的值的右边。根据上述思想我们可以得出以下结论:1.前序遍历的第一个数字是1,说明了根原创 2021-02-14 14:49:53 · 181 阅读 · 0 评论 -
6.从尾到头打印链表
6.从尾到头打印链表题目:输入一个链表的头节点,从尾到头打印出每个节点的值。链表定义如下:/** * Definition for singly-linked list. * */public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.原创 2021-02-14 01:24:15 · 103 阅读 · 0 评论 -
5.替换空格
5.替换空格题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如,输入"We are happy.’,则输出"We%20are%20happy."按照惯例,先给出暴力解法,时间复杂度O(n2)O(n^2)O(n2),空间复杂度O(1)O(1)O(1)。class solution1{ public String replaceSpqce(String str) { if (str == null) return null; StringBuffer res = new Strin原创 2021-02-14 00:35:35 · 85 阅读 · 0 评论 -
4.二维数组中的查找
4.二维数组中的查找题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否含有该整数。暴力解法(鄙人的最爱),时间复杂度O(n2)O(n^2)O(n2),空间复杂度O(1)O(1)O(1)。class solution1{ public boolean find(int[][] array, int target) { if (array == null || array.length =原创 2021-02-14 00:18:06 · 279 阅读 · 0 评论 -
3.数组中的重复数字
3.数组中的重复数字题目一:找出重复的数字。在一个长度为n的数组里的所有的数字都在0~n-1的范围里,有些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。暴力解法,时间复杂度O(n2)O(n^2)O(n2),空间复杂度为O(1)O(1)O(1)。class Solution1{ public boolean duplicate(int[] nums)原创 2021-02-13 23:04:56 · 80 阅读 · 0 评论 -
2.单例模式
2.单例模式题目:设计一个类,规定只能生成一个该类的实例。普通解法,单线程环境下不会出错,但是多线程环境下可能会出错。//单线程环境public class Singleton1{ private static Singleton1() { } private static Singleton1 instance = null; public static Singleton1 getInstance() { if (instance == null) { return new原创 2021-02-13 21:02:45 · 1240 阅读 · 4 评论