首页
Search
1
关于a标签的onclick事件可能会出现的问题
224 阅读
2
gitignore配置不生效问题
221 阅读
3
mapstruct的简单使用(可能会出现的问题)
194 阅读
4
2023/10/10 LeetCode
186 阅读
5
log4j包依赖冲突
182 阅读
默认分类
前端基础学习
后端学习
swagger
redis
日志管理
刷题记录
2023/10刷题记录
java常见问题
登录
Search
Guardyou3
累计撰写
10
篇文章
累计收到
334
条评论
首页
栏目
默认分类
前端基础学习
后端学习
swagger
redis
日志管理
刷题记录
2023/10刷题记录
java常见问题
页面
搜索到
10
篇与
guardyou3
的结果
2023-10-12
2023/10/11 LeetCode
LeetCode P215数组中第K个最大元素 描述: 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。/** * P215数组中第k个最大元素(堆排序的做法) * @param nums * @param k * @return * 思路:堆排序只需要从堆顶取k-1个元素即是第k个最大元素值 */ public int findKthLargest(int[] nums, int k) { //构建堆,从最后一个没有叶子结点的开始 for (int i=nums.length/2-1;i>=0;i--) { maxHeapify(nums,nums.length,i); } System.out.println(Arrays.toString(nums)); for (int i=nums.length-1; i >= nums.length - k + 1;i--) { swap(nums,0,i); //将最大值放入数组最后 maxHeapify(nums,i,0); //删除最后一个节点重建堆 } return nums[0]; } /** * * @param nums 数组 * @param n 数组个数 * @param i 当前堆顶元素下标 */ public void maxHeapify(int[] nums,int n,int i) { int largeMax = i; int left = i*2+1; int right = i*2+2; if (left<n&&nums[left]>nums[largeMax]) { largeMax = left; } if (right<n&&nums[right]>nums[largeMax]) { largeMax = right; } if (largeMax!=i) { swap(nums,i,largeMax); //将最大值放入堆顶 maxHeapify(nums,n,largeMax); //重建堆 } } /** * 数组交换 * @param num * @param l * @param r */ public void swap(int[] num,int l,int r) { int temp = num[l]; num[l] = num[r]; num[r] = temp; }
2023年10月12日
61 阅读
47 评论
0 点赞
2023-10-11
BigDecimal的使用问题
关于使用BigDecimal会出现的几个常见问题介绍 :BigDecimal类在金融开发行业被广泛使用,不知道大家在使用BigDecimal的时候是否会出现一些问题,这里博主来介绍使用BigDecimal可能会导致的错误( 文章完整示例代码在底部 ){callout color="#ef4d4d"}问题一{/callout}demo1 :这里我们创建两个BigDecimal对象,使两个对象的值都为0.1,第一个bigDecimal1直接传入一个浮点数,第二个bigDecimal2通过valueOf的方式创建对象,那个如果我们运行这个测试,那么按照我们最初的想法,打印的值都为0.1才对,但是事实真是如此吗?下面我们来进行测试。demo1结果: 我们观察发现,第一个bigDecimal1的值为一长串的浮点数,它其实是一个0.1的近似值,而BigDecimal2的值为0.1,具体的原因其实是因为0.1无法被一个有限位的二进制表示出来,所以是一个0.1的近似值存在了BigDecimal中,而第二个值bigDecimal2是一个准确值,为什么呢?我们通过其源码来进行分析。我们可以发现在其源码中,返回的BigDecimal对象经过了Double的数值转换为一个字符串,此时不会出现精度问题注意:如果我们传入的值超过了double的范围,他也会出现精度问题 解决方法: 既然我们知道valueOf在底层帮我们进行了一个字符串转换,那么我们直接在创建BigDecimal对象的时候就直接传入一个字符串,那么我们不是就可以绕过这个问题了吗。 例子: 我们任意传入一个很大的值,可以发现并没有出现精度问题,因此我们就可以通过传入字符串的方式避免第一个陷阱。其实idea已经给了我们提示了:{callout color="#ef4d4d"}问题二{/callout}demo2: 这里我们创建两个BigDecimal对象,我们对其分别使用equals方法和compareTo方法进行值的比较demo2结果: 我们可以发现,通过equals方法进行比较的值是false,而compareTo方法返回0(true),为什么第一个方法的比较值为false呢?我们进入源码中查看问题分析: 通过观察发现,BigDecimal对象重写了Object类的equals方法,在此方法中首先对其 精度进行了比较 ,这也就是说如果两个对象的值在逻辑上是相同的,但因为精度不同的BigDecimal对象将不被认为其值相等,这就是为什么会返回false原因,而compareTo方法只比较数值,返回值为-1,0,1。因此我们如果要对两个BigDecimal对象进行数值比较的话,采用compareTo方法返回0即可说明相等,当然如果在某些情况需要强行让精度相同才认为数值相同的话,我们也可以使用equals方法进行比较,灵活运用就好{callout color="#ef4d4d"}问题三{/callout} demo3: 我们定义了两个BigDecimal对象,值分别为1.0和3.0,我们让两个对象相除,这个时候是否会有问题?我们知道1除以3的结果是一个循环小数0.3333...,如果我们执行程序能够正常打印吗?demo3结果: 发现此时抛出了一个异常,其大致的意思就是没有指定精度,返回的结果必须是一个精确的数值。问题解决: 其实在BigDecimal已经帮我们解决了这个问题了我们可以使用divide的一个重载方法,其第一个参数是divisor是除数,第二个参数scale是精度,也就是返回的小数位数,第三个参数是RoundingMode是一个枚举类,我们可以通过其指定保留精度的规则,比如四舍五入或者直接抹掉。 修改后的代码: 此时我们指定保留两位小数,并且采用四舍五入的方式(RoundingMode.HALF_UP),发现正确打印出来精确的结果0.33{callout color="#ef4d5d"}这里列出几种常见的RoundingMode类型RoundingMode.UP:向远离0的方向舍入(5.5 -> 6)(-5.5 -> -6)RoundingMode.DOWN:向靠近0的方向舍入(1.1 -> 1)(-5.5 -> -5)RoundingMode.CEILING:向正无穷方向舍入(1.1 -> 2)(-5.5 -> -5)RoundingMode.FLOOR:向负无穷方向舍入(1.6 -> 1)(-1.1 -> -2)还有另外4种模式,感兴趣的也可以直接翻看源码,这里就不一一列出了{/callout}综上就是使用BigDecimal可能会出现的三种问题 demo源码:public class BigDecimalTest { @Test public void bigDecimalTest1() { BigDecimal bigDecimal1 = new BigDecimal(0.1); BigDecimal bigDecimal2 = BigDecimal.valueOf(0.1); System.out.println("bigDecimal1 = "+bigDecimal1); System.out.println("bigDecimal2 = "+bigDecimal2); System.out.println(new BigDecimal("11111111111111111111111111111.222222222")); } @Test public void bigDecimalTest2() { BigDecimal bigDecimal1 = new BigDecimal("0.10"); BigDecimal bigDecimal2 = new BigDecimal("0.1"); System.out.println("equals方法比较结果:"+bigDecimal1.equals(bigDecimal2)); System.out.println("compareTo方法比较结果:"+bigDecimal1.compareTo(bigDecimal2)); } @Test public void bigDecimalTest3() { BigDecimal bigDecimal1 = new BigDecimal("1.0"); BigDecimal bigDecimal2 = new BigDecimal("3.0"); BigDecimal bigDecimal3 = bigDecimal1.divide(bigDecimal2,2, RoundingMode.HALF_UP); System.out.println("两个数相除的结果:"+bigDecimal3); } }
2023年10月11日
71 阅读
6 评论
1 点赞
2023-10-10
2023/10/10 LeetCode
LeetCode p11 盛最多水的容器描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。思路 :既然是要求当前可以存储的最大水量,那么按照常规思路,只需要定义两个指针指向首尾作为容器的边界,我们每次将最小的值的指针向另一指针移动,记录每次移动的容器中的大小值,即可找到最大的容器盛水量。代码 : /** * P11盛最多水的容器 * @param height * @return */ public int maxArea(int[] height) { int result = 0; int heightMax = 0; for (int i=0,j=height.length-1;i<j;) { heightMax = Math.min(height[i], height[j]); //取最小的高度 int curMax = (j-i)*heightMax; //求当前面积 System.out.println("i="+i+",j="+j+",cur="+curMax); result = Math.max(result,curMax); if (height[i]>height[j]) { j--; } else { i++; } } return result; }LeetCode P160 相交链表 描述 :给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。思路: 按照题目所需要找到两个链表的交点,那么我们思考一下如果存在交点,那么这个交点后面的节点必是相同节点,既然如此,我们直接将短的一个链表与长链表进行一个右对齐,然后遍历连个链表,只要存在节点相等,即可说明该节点是两个节点的交点,如果链表遍历完成都未找到相等节点,即说明不存在交点,直接返回null值即可。 代码:/** * P160 相交链表 * @param headA * @param headB * @return */ public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode a = headA; ListNode b = headB; int aLength = 0; int bLength = 0; // 判断哪个链表比较长 while (a!=null) { aLength++; a = a.next; } while (b!=null){ bLength++; b = b.next; } ListNode longList; ListNode shortList; int sub; if (aLength>bLength){ longList = headA; shortList = headB; sub = aLength-bLength; } else { longList = headB; shortList = headA; sub = bLength - aLength; } //移动长链表与短链表进行对齐 while (sub>0) { longList = longList.next; sub--; } while (longList!=null) { if (longList==shortList) return longList; longList = longList.next; shortList = shortList.next; } return null; }
2023年10月10日
186 阅读
45 评论
0 点赞
2023-10-04
2023/10/4 LeetCode
LeetCode P128最长连续序列描述:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。解题思路:因为时间复杂度为O(n),所以不能够先排序在进行for遍历,所以考虑使用Hash集合,因为查询的时间复杂度为O(1),我们直接利用HashSet进行去重,外层循环需要 O(n) 的时间复杂度,同时为了防止不必要的遍历,只有当一个数是连续序列的第一个数的情况下才会进入内层循环,然后在内层循环中匹配连续序列中的数,因此数组中的每个数只会进入内层循环一次。根据上述分析可知,总时间复杂度为 O(n)。详细代码如下: /** * P128最长连续序列 * @param nums * @return */ public int longestConsecutive(int[] nums) { //去重 HashSet<Integer> hashSet = new HashSet<>(); for (int num : nums) { hashSet.add(num); } int result = 0; for (Integer num : hashSet) { if (!hashSet.contains(num-1)) { int max = 1; int currentNum = num; while (hashSet.contains(currentNum+1)) { max++; currentNum++; } result = Math.max(result,max); } } return result; }
2023年10月04日
107 阅读
5 评论
1 点赞
2022-04-10
关于a标签的onclick事件可能会出现的问题
在对JavaScript的学习当中,实现通过a标签设置点击事件实现点击一次就显示对应div的内容,在点击一次将对应的div隐藏。代码实现1.首先设置对应的标签的id值便于在JavaScript中进行查找。(此处i标签引入一个图标)<a id="setUp" href=""><i class="fa fa-cog fa-2x" style="line-height: 60px;margin-left: 50px"></i></a> <div class="setSelect" id="setSelecter"> <ul> <li><a href="">换肤</a></li> <li><a href="">登录</a></li> </ul> </div>2.通过设置对应div的属性(首先隐藏div,即设置display为none值).setSelect{ width: 100px; height: auto; background-color: silver; position: absolute; border: black solid 1px; left: 91%; display: none; } .setSelect ul li{ width: 100px; list-style-type: none; text-align: center; margin-bottom: 10px; }3.注册对应事件实现点击功能<script type="text/javascript"> window.onload = function () { var setObj = document.getElementById("setUp"); var flag = true; setObj.onclick = function () { let setSelectObj = document.getElementById("setSelecter"); flag = !flag; if(flag) { setSelectObj.style.display = "block"; return false; } else { setSelectObj.style.display = "none"; return false; } } } </script>注意在a标签中,如果设置了onclick事件,那么链接的onclick事件先被执行,然后在实现href属性的动作,假设链接中同时存在href 与onclick,如果想让href 属性下的动作不执行,onclick 必须得到一个false的返回值,如果不设置返回值为FALSE,那么点击过后会实现跳转,此时会导致页面刷新,重置js代码中判断标志flag的值为TRUE,也就是说点击一次会刷新一次,flag的值永远为true,这也就是为什么隐藏的div无法成功显示出来,因为执行了href动作使页面刷新了,通过设置返回值为false让其链接失效,达到我们的需求点击一次显示隐藏的div,在点击一次隐藏div。
2022年04月10日
224 阅读
20 评论
0 点赞
1
2