- 博客(13)
- 收藏
- 关注
原创 gradle脚本实现不同环境配置打包
gradle脚本实现不同环境配置打包 在build.gradle中最下面添加以下脚本 //代码中的xx表示是哪个环境,比如xx能改成dev环境或者其他环境 jar.doFirst { if (!project.hasProperty('xx')) return def list = [] new File('build/resources/main/application.yml').withReader('UTF-8') { reader -> reader.
2021-07-06 14:20:56
1376
原创 Java剑指Offer:11.二进制中1的个数
11.二进制种1的个数 题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 示例1 输入 10 返回值 2 思路: 如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是101
2020-11-29 20:03:15
134
原创 Java剑指Offer:10.矩形覆盖
10.矩形覆盖 题目描述 我们可以用2 * 1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2 * 1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 示例1. 输入 4 返回值 5 思路: 假设:n块矩形有f(n)种覆盖方法。进行逆向分析,要完成最后的搭建有两种可能。 通过n-1个矩形,在添加一个矩形,能完成覆盖 通过n-2个矩形,在添加两个矩形,能完成覆盖 故f(n) = f(n-1) + f(n-2),还是一个斐波那契数列,因此本题也
2020-11-22 14:04:41
151
原创 Java剑指Offfer:9.变态跳台阶
9.变态跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 示例: 输入 3 返回值 4 思路: 像这种一个问题,能由子问题来解决的,通常使用动态规划的思想。 定义状态:int dp[target.length + 1] ,dp[i] 表示跳到第 i 个台阶,有多少种方法。 状态转移方程:dp[i] = dp[i-1]+dp[i-2]+~~~+dp[0],因为到第 i 层台阶,可以从第0层跳 i 层台阶到达,从第1层跳n-1层
2020-11-21 21:51:21
156
原创 Java剑指Offer:8.跳台阶
8.跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 示例 输入 1 返回值 1 输入 4 返回值 5 思路: 本题思路和斐波那契数列思路一样,都是使用动态规划来解决。 定义状态:int dp[target.length+1],dp[i]表示到第 i 个台阶,可以有多少种跳法 状态转移方程:dp[i] = dp[i-1] + dp[i-2],因为要到达第 i 台阶,有2种方法:能通过第 i-1 台阶,跳1级
2020-11-21 21:07:27
145
原创 Java剑指Offer:7.斐波那契数列
7.斐波那契数列 思路: 斐波那契数列的公式:f(n) = f(n-1) + f(n-2),其中f(0) = 0,f(1) = 1。 使用动态规划实现斐波那契数列: 确定状态:int[] dp,使用int[]数组来定义状态,dp[i]表示的就是上面的f(i) 。 状态转移方程:dp[i] = dp[i-1] + dp[i-2],直接套用斐波那契数列的公式即可 初始化:dp[0] = 0,dp[1] = 1,同上 代码实现: public class Solution { //使用动态规划解答,
2020-11-21 20:37:24
206
原创 Java剑指Offer:6.旋转数组中的最小数字
6.旋转数组的最小数字 思路: 该题主要考察对二分查找的理解和应用。 设置左右边界,left = 0,right = arr.length - 1 设置while循环的判定条件,left < right 先判断当前数组或者子数组,是否为非递减数组,比如 1,1,3,4,5,5这种就是非递减数组,如果是非递减数组,说明当前子数组就是旋转后的那一部分升序子数组,arr[left]就是我们所要求的结果。比如3,4,5,1,2。如果left = 3,right = 4即此时,子数组为1,2,为非递减数组
2020-11-20 20:41:58
133
原创 Java剑指Offer:5.栈实现队列
5.用栈实现队列 思路: 栈:先进后出 队列:先进先出 分配这2个栈的使用:stack1存放数据,stack2作为中转栈,用来中转数据。 代码实现: import java.util.Stack; //栈实现双向队列 public class Solution5 { //stack1 主要用于存放数据 Stack<Integer> stack1 = new Stack<Integer>(); //stack2 主要用于中转 Stack<I
2020-11-19 21:39:08
128
原创 Java剑指Offer:4.由前序中序遍历重构二叉树
4.前中序遍历还原二叉树 思路: 首先要理解如何根据二叉树的前序遍历和中序遍历还原一棵二叉树。 具体还原步骤可分为7步,根据下图来讲解具体的实现步骤: 1、先找到前序遍历的第一个节点,也就是根节点root 2、在中序遍历中找到root节点的位置 3、中序遍历中,root节点的没用到的左边节点,为当前root节点的左子树 4、中序遍历中,root节点的没用到的右边节点,为当前root节点的右子树 5、回到前序遍历,根据3步骤中找到的左子树,在前序遍历中画出当前root节点的左子树 6、回到前序遍历,根据4
2020-11-18 21:04:44
171
原创 Java剑指Offer:3.从头到尾打印链表
3.从尾到头打印链表 思路1: 原地反转链表之后进行顺序遍历,反转链表详解请看之前我的博客一次遍历反转链表 代码实现: import java.util.ArrayList; //反转链表之后进行顺序遍历 public class Solution3 { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if (listNode == null) return new Arra
2020-11-17 15:02:56
175
原创 一次遍历反转链表详解
反转链表 反转链表是面试中经常碰到的手撕算法题,通常要求在一次遍历后,得到反转之后的链表,下面通过3副图片和具体实现的代码,来详细地介绍,如何一次遍历反转链表。 第一步:新建dummy节点,指向链表的头部,这个节点的作用就是一直指向链表的头节点,最终返回链表的时候直接返回dummy.next就可以了。 第二步: 通过while循环,不断向后移动链表的头节点listNode,并把listNode的下一个节点移动到链表的头部,来形成反转链表,直到listNode.next == null 为止,就形成了反转之
2020-11-17 14:50:19
419
原创 Java剑指Offer:2.替换空格
2.替换空格 思路: 本题采用新建字符串加双指针的解法: 1.设置双指针下标 left = 0,right = 0,新建字符串sb用来保存替换后的字符串 2.设置while循环判定条件 right < str.length,主要是看 str.charAt(right) 是否为空格,因此右指针right 要小于str.length 在循环中分为2种条件: 如果 str.charAt(right) == ' ' ,又可细分为2种情况: 如果 此时左右指针相等,left == right,比如:"
2020-11-16 15:40:50
110
原创 Java剑指Offer:1.二维数组中的查找
1.二维数组中的查找 思路1: 使用暴力算法依次遍历进行比较,但是时间复杂度为O(n²),比较高。 //暴力查找二维数组中的目标数 public class Solution { //找到目标数方法 public boolean Find(int target, int [][] array) { if (array == null || array[0].length == 0) return false; for (int[] arr:array) {
2020-11-15 14:05:22
127
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅