- 博客(40)
- 收藏
- 关注
原创 Eclipse Mat,内存分析工具资源分享
资源地址 最近在学习JVM,需要用到eclipse mat工具,搜寻网上的资源,我发现不是在CSDN上的资源都是要赚取积分的(我也是服了,明明都是学习的,一些好的资源例如开发工具,不应该分享吗,没想到 一些人竟然赚取积分,咋想的),个人去官网上下载的使用国内的网站也是特别的慢,我也是服了,找的网上的某些资源由于是32位的,自己的电脑是64位的,不匹配,后来用了一些方法终于从MAT官网上下载下最新的...
2020-04-27 11:41:54
1859
9
原创 剑指 Offer 25.合并两个排序的链表
题目 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 题目链接:合并两个排序的链表 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 代码实现 //非递归方式,这里必须要有一个辅助节点 时间复杂度:O(n + m) 空间复杂度:O(1) public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
2020-08-04 22:40:35
221
原创 leetcode:反转链表 II
题目 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 题目链接:反转链表 II 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 思路和代码实现 //思路,双指针法。并且需要借助一个新的节点,pre节点表示待移动节点的前一个节点,cur表示移动节点, // next表示待移动节点的下一个节点,每次移动将n
2020-08-04 22:38:04
214
原创 剑指 Offer 24.反转链表
题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 题目链接:反转链表 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 要反转链表,目的就是要使指针指向前驱节点,因此需要保存前驱节点 代码实现 public ListNode reverseList(ListNode head) { ListNode pre = null; L
2020-08-04 22:35:12
233
原创 剑指offer23:链表中的环的入口节点
题目 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路 链表中是否有环使用的是龟兔赛跑算法,或者是快慢指针 代码实现 public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode meetNode = getMeetNode(pHead); if(meetNode==null){ return null; } ListNode nod
2020-08-04 22:29:44
186
原创 剑指 Offer 22. 链表中倒数第k个节点
题目 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。 题目链接:链表中倒数第k个节点](https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof) 示例: 给定一个链表: 1->2->3->4->5,
2020-08-04 22:24:14
162
原创 剑指offer18-II 删除链表中重复的结点
题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路 在待删除节点的前一个节点设置preNode指针,一直找到带删除节点的最后一个位置,将待删除节点的最后一个设置为preNode的next域。 代码 public static ListNode deleteDuplication(ListNode pHead) {
2020-08-04 22:16:27
147
原创 剑指offer18-1:在o(1)时间内删除链表
题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 思路 /删除节点通常的思路:找删除节点的前一个节点,需要遍历,时间复杂度为o(n),如果想要时间复杂度为o(1),那么可以使用待删除节点的后一个节点去覆盖待删除节点,然后再去删除后一个节点,这里有特殊情况,就是带删除节点是头结点,那么要将头结点置位空,如果带删除节点是链表的尾节点,那么只能从头遍历。 代码实现 public static void deleteNode(ListNode head,ListNode pToBe
2020-08-04 22:13:04
199
原创 剑指 Offer 06. 从尾到头打印链表
题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 题目链接: 从尾到头打印链表 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 思路 可以借助栈这种数据结构实现后进先出的案例。 代码 public static int[] reversePrint(ListNode head) { if(head==null){ return new int[0]; } Stack<ListNo
2020-08-04 22:07:53
132
原创 剑指 Offer 59 - I. 滑动窗口的最大值
题目 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -
2020-07-30 22:48:12
170
原创 剑指 Offer 57 - II. 和为s的连续正数序列
题目 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 题目链接:和为s的连续正数序列 示例 1: 输入:target = 9 输出:[[2,3,4],[4,5]] 示例 2: 输入:target = 15 输出:[[1,2,3,4,5],[4,5,6],[7,8]] 思路 可以使用双指针,构建滑动窗口,需要注意的是,滑动窗口的区间是左闭右开,即[i,j),并且滑动窗口只向右移动。 代码实现 /
2020-07-30 22:43:00
174
原创 剑指 Offer 56 - I. 数组中只出现一次的两个数字
题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 题目链接: 数组中只出现一次的两个数字 示例 1: 输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1] 示例 2: 输入:nums = [1,2,10,4,1,4,3,3] 输出:[2,10] 或 [10,2] 思路 任何数和本身异或则为0,任何数和 0 异或是本身。 我们依旧从头到尾异或每个数字,那么最终的结果就是这两个只出现
2020-07-30 22:37:12
187
原创 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例 1: 输入: [0,1,3] 输出: 2 示例 2: 输入: [0,1,2,3,4,5,6,7,9] 输出: 8 思路 使用二分查找,如果中间的数字m=nums[m],说明从0~m下标与数字对应的数字都是一一对应的,那么就向右查找,否则就向左查找。 代码实现 public static int missingNumber(in
2020-07-30 22:31:43
138
原创 剑指 Offer 53 - I. 在排序数组中查找数字 I
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 题目链接:在排序数组中查找数字 I 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] 思路 由于本题要求的算法时间复杂度
2020-07-30 22:09:57
142
原创 剑指 Offer 51. 数组中的逆序对
题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 题目链接:剑指 Offer 51. 数组中的逆序对 示例 1: 输入: [7,5,6,4] 输出: 5 思路 使用归并排序,重点在于合的过程中,使用两个指针指向数组的末尾,使用一个指针指向临时数组的末尾。如果第一个子数组中的数字大于第二个子数组的数字,那么则构成逆序对,并且逆序对的数目等于等于第二个数组中剩余数字的个数。 代码实现 //时间复杂度0(nlogn),空间复杂度o
2020-07-30 22:00:22
162
原创 剑指 Offer 45. 把数组排成最小的数
题目 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 题目链接:把数组排成最小的数 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: [3,30,34,5,9] 输出: "3033459" 思路 本题实质上是排序,但是这个排序不仅仅是比较数值的大小,还包括字符串的比较,时间复杂度o(nlogn) 空间复杂度o(n)。 具体排序规则如下: 如果 x+y>y+x 那么我们就说想x<y 如果x+y<y+x 那么我们就说
2020-07-30 21:55:07
183
原创 剑指 Offer 42. 连续子数组的最大和连续子数组的最大和
题目 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 题目链接:连续子数组的最大和连续子数组的最大和 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 思路 因为本题要求的时间复杂度是O(N),所以说只能遍历一遍数组,这里可以使用动态规划思想。 具体步骤如下: 1.首先对数组进行遍历,当前最大连续子序列和为 sum
2020-07-30 21:45:47
161
原创 剑指 Offer 40. 最小的k个数
题目 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 题目链接:最小的k个数 示例 1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例 2: 输入:arr = [0,1,2,1], k = 1 输出:[0] 思路 这类问题属于Topk问题,解决这类问题主要有两种思路。 方式1 快排变形 基于快排的变形,基于数组的第k个数字来调整,是小于k的数字都在k的左边(这k个数字不一
2020-07-30 21:36:31
193
原创 剑指 Offer 39. 数组中出现次数超过一半的数字
题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 题目链接:数组中出现次数超过一半的数字 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 思路 方式1 排序,取中间 public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; } 时间
2020-07-28 09:13:52
158
原创 剑指 Offer 29. 顺时针打印矩阵
题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 题目链接:顺时针打印矩阵 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7] 思路 就像剥橘子皮一样,由外向内逐层按照顺时针的顺序逐层剥橘子皮。 代码实现 //思路:由外向内,逐层打
2020-07-28 09:03:38
273
原创 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 题目链接:调整数组顺序使奇数位于偶数前面 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。 思路 使用双指针,分别指向数组的开始和结尾位置,分别判断各种情况。 代码实现 public static int[] exchange(int[] nums) { int low = 0;
2020-07-28 08:54:46
127
原创 剑指offer11:旋转数组的最小数字
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 题目链接:旋转数组的最小数字 示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 思路 最简单的方式就是使用暴力方式,循环遍历数组寻找数组的最小值。但是这种方式没有利用题目中旋转数组的特点,仔细观察题目以最小值为分界线两边是有序
2020-07-28 08:50:28
140
原创 剑指offer4:二维数组的查找
题目 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 题目链接:二维数组的查找 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 t
2020-07-27 22:30:31
104
原创 剑指offer57-1:和为s的两个数字
题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 题目链接:和为s的两个数字 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[2,7] 或者 [7,2] 示例 2: 输入:nums = [10,26,30,31,47,60], target = 40 输出:[10,30] 或者 [30,10] 思路 使用双指针,分别指向数组的开头和结尾。如果两个两个指针对应的值大于target,尾指
2020-07-27 22:22:32
167
原创 剑指offer3-2:不修改数组找出重复的数字
题目 在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2, 3, 5, 4, 3, 2, 6, 7},那么对应的输出是重复的数字2或者3。 思路 方式1 使用哈希表 public static boolean duplicate2(int numbers[], int length, int[] duplication) { //判断数组是否非法 i
2020-07-27 22:10:06
197
原创 LeetCode:环形链表,找出环形链表中环的第一个元素(链表)
题目 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 题目链接:环形链表II 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1
2020-07-27 21:56:42
318
原创 LeetCode:环形链表(链表)
题目 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 题目链接:环形链表 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [
2020-07-27 21:45:56
132
原创 LeetCode:删除排序数组中的重复项(数组)
题目 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 题目链接:删除排序数组中的重复项 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4],
2020-07-27 21:30:27
144
原创 LeetCode:删除排序数组中的重复项(数组)
题目 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 题目链接:删除排序数组中的重复项 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4],
2020-07-25 17:24:33
125
原创 LeetCode:最长连续递增子序列(数组)
题目 给定一个未经排序的整数数组,找到最长且连续的的递增序列,并返回该序列的长度。 题目链接:最长连续递增子序列 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1,3,5], 长度为3。 尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。 示例 2: 输入: [2,2,2,2,2] 输出: 1 解释: 最长连续递增序列是 [2], 长度为1。 思路 标签:遍历 过程: count 为当前元素峰值,ans为最大峰值 初始化
2020-07-25 15:58:46
971
原创 LeetCode:高度检查器(数组)
题目 题目链接:高度检查器 学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。 请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。 注意,当一组学生被选中时,他们之间可以以任何可能的方式重新排序,而未被选中的学生应该保持不动。 示例: 输入:heights = [1,1,4,2,1,3] 输出:3 解释: 当前数组:[1,1,4,2,1,3] 目标数组:[1,1,1,2,3,4] 在下标 2 处(从 0 开始计数)出现 4 vs 1 ,所以我们必须移动这名学生。 在下标 4 处(从
2020-07-25 15:47:40
163
原创 剑指offer3-1:找出数组中重复的数字
题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。 思路 第1种 暴力方式 使用排序算法将数组进行排序,遍历数组,比较数组中的重复项。 public static boolean duplicate1(int numbers[], int length, int[] duplica
2020-07-25 15:37:03
158
原创 JVM4:类加载器解析
1. 类加载阶段 1.1 加载 klass 每个Java对象的对象头里,_klass 字段会指向一个VM内部用来记录类的元数据用的 InstanceKlass 对象;InsanceKlass 里有个 _java_mirror 字段,指向该类所对应的Java镜像——java.lang.Class实例。HotSpot VM 会给 Class 对象注入一个隐藏字段 “klass”,用于指回到其对应的 InstanceKlass 对象。这样,klass 与 mirror 之间就有双向引用,可以来回导航。 这个模型里
2020-05-10 19:05:01
606
原创 消息队列面试题详解
消息队列面试题详解 1.为什么要使用消息队列?(消息队列的应用场景) 解耦,异步(可以提高响应请求),削峰(经济实用性的考量) 2.各种消息产品的比较 ActiveMQ,早起使用的较多,没经过大规模吞吐量场景的验证,社区也不是很活跃,但是现在确实大家用的不多了,不推荐。 RabbitMQ,开发语言 erlang 阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,但是RabbitMQ是开源的,比较稳定的支持,活跃度也高,如不考虑二次开发,追求性能和稳定性,推荐使用。 Ro
2020-05-09 15:18:09
411
原创 JVM系列3:垃圾回收
垃圾回收 如何判断对象可以回收 垃圾回收算法 分代垃圾回收 垃圾回收器 垃圾回收调优 1. 如何判断对象可以回收 1.1 引用计数法 1.2 可达性分析算法 Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象 扫描堆中的对象,看是否能够沿着 GC Root对象 为起点的引用链找到该对象,找不到,表示可以回收 哪些对象可以作为 GC Root ? 1.3 四种引用的定义 引用...
2020-05-03 09:58:13
370
原创 JVM系列2:内存结构
内存结构 程序计数器 虚拟机栈 本地方法栈 堆 方法区 直接内存 1. 程序计数器 1.1 定义 Program Counter Register 程序计数器(寄存器) 作用,是记住下一条jvm指令的执行地址 特点 是线程私有的 不会存在内存溢出 1.2 作用 //jvm指令 0: getstatic #20 // PrintStream ...
2020-04-26 17:27:21
267
原创 JVM系列1:JVM简要介绍
1.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码...
2020-04-25 18:20:00
228
原创 使用ssm和poi实现excel的导入导出(简单详细,附源码,适合入门的小白)
最近在学习中遇到了excel的导入和导出操作,上网查了很长时间,没有一个特别适合小白的项目,因此自己做了一个简单的可以实现导入导出功能的项目,自己做了好长时间,特此记录一下,废话不多说,看代码。 1工程目录结构 2.在maven项目中导入相关的jar包依赖 <dependency> <groupId>commons-fileupload</groupId>...
2019-07-18 11:12:28
5383
13
原创 使用Springmvc实现文件的上传和下载
最近在学习中,遇到了文件上传和下载的操作,由于刚刚学习,可能有不对的地方,希望大家指出,相互进步,话不多说直接上代码。 1.首先准备文件上传的jar包 2在springmvc容器中进行配置 <!-- 在springmvc的配置文件中配置上传文件的bean --> <bean id="multipartResolver" class="org.springframework...
2019-07-17 21:18:34
160
原创 关于Javaweb中servlet配置打开网页显示404无法找到的原因和解决方法
自己是一名Java小白,在自己学习servlet时打开网页,浏览器总是发出404错误,在网上找了好多资料,自己决定整理一篇。 在Java中配置servlet有两种方法,第一种是在web.xml中进行配置,例如。 <servlet> <servlet-name>HelloServlet</servlet-name>//name名称可以是自己定义的,随便写,...
2019-03-12 22:20:55
18161
7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅