- 博客(40)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Eclipse Mat,内存分析工具资源分享
资源地址最近在学习JVM,需要用到eclipse mat工具,搜寻网上的资源,我发现不是在CSDN上的资源都是要赚取积分的(我也是服了,明明都是学习的,一些好的资源例如开发工具,不应该分享吗,没想到 一些人竟然赚取积分,咋想的),个人去官网上下载的使用国内的网站也是特别的慢,我也是服了,找的网上的某些资源由于是32位的,自己的电脑是64位的,不匹配,后来用了一些方法终于从MAT官网上下载下最新的...
2020-04-27 11:41:54
1332
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
153
原创 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
139
原创 剑指 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
157
原创 剑指offer23:链表中的环的入口节点
题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路链表中是否有环使用的是龟兔赛跑算法,或者是快慢指针代码实现public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode meetNode = getMeetNode(pHead); if(meetNode==null){ return null; } ListNode nod
2020-08-04 22:29:44
120
原创 剑指 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
109
原创 剑指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
89
原创 剑指offer18-1:在o(1)时间内删除链表
题目给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。思路/删除节点通常的思路:找删除节点的前一个节点,需要遍历,时间复杂度为o(n),如果想要时间复杂度为o(1),那么可以使用待删除节点的后一个节点去覆盖待删除节点,然后再去删除后一个节点,这里有特殊情况,就是带删除节点是头结点,那么要将头结点置位空,如果带删除节点是链表的尾节点,那么只能从头遍历。代码实现 public static void deleteNode(ListNode head,ListNode pToBe
2020-08-04 22:13:04
129
原创 剑指 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
82
原创 剑指 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
114
原创 剑指 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
119
原创 剑指 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
116
原创 剑指 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
88
原创 剑指 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
86
原创 剑指 Offer 51. 数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。题目链接:剑指 Offer 51. 数组中的逆序对示例 1:输入: [7,5,6,4]输出: 5思路使用归并排序,重点在于合的过程中,使用两个指针指向数组的末尾,使用一个指针指向临时数组的末尾。如果第一个子数组中的数字大于第二个子数组的数字,那么则构成逆序对,并且逆序对的数目等于等于第二个数组中剩余数字的个数。代码实现//时间复杂度0(nlogn),空间复杂度o
2020-07-30 22:00:22
102
原创 剑指 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
83
原创 剑指 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
107
原创 剑指 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
93
原创 剑指 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
94
原创 剑指 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
213
原创 剑指 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
66
原创 剑指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
90
原创 剑指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
57
原创 剑指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
68
原创 剑指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
125
原创 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
218
原创 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
70
原创 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
88
原创 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
65
原创 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
851
原创 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
99
原创 剑指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
87
原创 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
503
原创 消息队列面试题详解
消息队列面试题详解1.为什么要使用消息队列?(消息队列的应用场景)解耦,异步(可以提高响应请求),削峰(经济实用性的考量)2.各种消息产品的比较ActiveMQ,早起使用的较多,没经过大规模吞吐量场景的验证,社区也不是很活跃,但是现在确实大家用的不多了,不推荐。RabbitMQ,开发语言 erlang 阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,但是RabbitMQ是开源的,比较稳定的支持,活跃度也高,如不考虑二次开发,追求性能和稳定性,推荐使用。Ro
2020-05-09 15:18:09
327
原创 JVM系列3:垃圾回收
垃圾回收如何判断对象可以回收垃圾回收算法分代垃圾回收垃圾回收器垃圾回收调优1. 如何判断对象可以回收1.1 引用计数法1.2 可达性分析算法Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象扫描堆中的对象,看是否能够沿着 GC Root对象 为起点的引用链找到该对象,找不到,表示可以回收哪些对象可以作为 GC Root ?1.3 四种引用的定义引用...
2020-05-03 09:58:13
301
原创 JVM系列2:内存结构
内存结构程序计数器虚拟机栈本地方法栈堆方法区直接内存1. 程序计数器1.1 定义Program Counter Register 程序计数器(寄存器)作用,是记住下一条jvm指令的执行地址特点是线程私有的不会存在内存溢出1.2 作用 //jvm指令0: getstatic #20 // PrintStream ...
2020-04-26 17:27:21
207
原创 JVM系列1:JVM简要介绍
1.什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码...
2020-04-25 18:20:00
154
原创 使用ssm和poi实现excel的导入导出(简单详细,附源码,适合入门的小白)
最近在学习中遇到了excel的导入和导出操作,上网查了很长时间,没有一个特别适合小白的项目,因此自己做了一个简单的可以实现导入导出功能的项目,自己做了好长时间,特此记录一下,废话不多说,看代码。1工程目录结构2.在maven项目中导入相关的jar包依赖<dependency> <groupId>commons-fileupload</groupId>...
2019-07-18 11:12:28
5231
13
原创 使用Springmvc实现文件的上传和下载
最近在学习中,遇到了文件上传和下载的操作,由于刚刚学习,可能有不对的地方,希望大家指出,相互进步,话不多说直接上代码。1.首先准备文件上传的jar包2在springmvc容器中进行配置<!-- 在springmvc的配置文件中配置上传文件的bean --> <bean id="multipartResolver" class="org.springframework...
2019-07-17 21:18:34
107
原创 关于Javaweb中servlet配置打开网页显示404无法找到的原因和解决方法
自己是一名Java小白,在自己学习servlet时打开网页,浏览器总是发出404错误,在网上找了好多资料,自己决定整理一篇。在Java中配置servlet有两种方法,第一种是在web.xml中进行配置,例如。<servlet> <servlet-name>HelloServlet</servlet-name>//name名称可以是自己定义的,随便写,...
2019-03-12 22:20:55
17829
7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人