随笔一则
是夜,原本摆了一天的我深夜焦虑起来了,遂打开力扣写了一道算法。。。。。。。。。
没想到一道中等难度的题便成了拦路虎,将我斩于马下。我看着最长连续序列(明明一次排序+遍历就彳亍),死活
想不起来数组的排序方法怎么用,于是想尝试以下最近常用的stream。却没想到这是尴尬的开始。
我将数组的int元素转化成了Integer(装箱后),却用"=="来比较他们的大小,于是再测试的时候没有问题,却在提
交的时候数据过大显示错误。我百思不得其解,遂请教万能的群友。经过群友的点拨,我茅塞顿开,却也沦为笑柄
😕 。群友不仅指出我舍近求远放着封装好的Arrays.sort()方法不用,非要用stream,是不是学魔怔了,而且还
点出我许多知识盲区,遂写下此篇,铭记这一耻辱的一天:
- 当基本类被装箱后,不能再使用==来比较,需要注意的是,对象 i 和 p 之所以等价为 true,是因为它们是同一个对象,
比较不是基于值,而是基于对象的等价性。如果整数 i 和 p 不在 -128 或 127 的范围内,则不会使用缓存,因此会创建新的对象。 - 在进行值比较时,请务必使用".equals "方法。还需要注意的是,实例化 Integer 并不会创建缓存。
- Java对较小的Integer对象是有缓存的,默认范围是-128 to 127,在这个范围内你构造相同数字会返回同一个对象,具体可以看看Integer.valueOf方法以及IntegerCache类(java装箱缓存)
- 本题还可以使用柯朵莉树来暴力解题,但是柯朵莉树不会,还需要继续沉淀(Hallo 算法永远的神)
- 本题使用Hashset可以优化时间复杂度度为O(n),现在使用Arrays时间复杂度为O(nlogn),具体解法可以看最长连续序列
- 其实就算用流操作也完全可以,错就错在不该调mapToObj,IntStream也是有sorted方法的,退一万步讲,即使需要把IntStream换成Stream
,其实也应该用Integer.boxed()才对(看来我还得接着深造stream)
评论区