文章目录
题目类型
找出缺失的值
找出缺失的值有三种思路:
- 位运算(异或) 相同的数字会变成0
- 求和
- 哈希
- 面试题 17.19. 消失的两个数字
用上面总结的三个方法都可以处理。
异或的思路:在元素组的基础上在异或1到len+2的数字便可以让缺失的数字只出现一次,而其他数字都出现了两次。
桶
- AAAA473. 火柴拼正方形
尝试把火柴填入四个桶中,火柴遍历结束之后,若四个桶的包含的长度相同,则说明可以构成正方形。
区间
- AAAA986. 区间列表的交集
若区间a的右端点小于区间b的左端点则两个区间一定不相交。
两数之和
- AAA1995. 统计特殊四元组
把a+b+c=d转换成a+b=d-c,然后统计满足a+b=d-c的个数。每次遍历新的b,都会得到新的c,也就得到新的d-c,把d-c加入到map集合中,用map集合匹配a+b与d-c。 - 454. 四数相加 II
把a+b+c+d = 0转成计算a+b存储下来计算c+d的时候,判断是否存在-(a+b)。
奇怪的遍历方式
- $$6072. 转角路径的乘积中最多能有几个尾随零
把求转弯路径变成了计算因子5,2的个数。
判断重复元素
*219. 存在重复元素 II
*220. 存在重复元素 III
36. 有效的数独
把数组中的数字转成一个二维数组的第二维下标,若这个二维数组的内容已经被修改过了,说明存在相同的元素。示例:
217. 存在重复元素
Stream的方法distinct() 返回由此流的不同元素组成的流。
299. 猜数字游戏
用两个数组分别记录两个两个字符串相同的数字个数,遍历数组取较小值是两者的交集,即公共的数字个数。
接雨水 用数组存储左右两边遍历的结果
- 238. 除自身以外数组的乘积
用一个数组存储nums[i]左右两端的乘积; - *6035. 选择建筑的方案数
以’010’为例,以中间的1为中心分别计算1两边0的个数,相乘便是以这个1为中心的’010’的全部个数
模拟
- 228. 汇总区间
选出数组的连续区间
回文
- *5253. 找到指定长度的回文数
拼出左半部分,反转凑出右半部分,最后合并两半。
多路归并
在两个数组中寻找第k大的数
- AAAA4. 寻找两个正序数组的中位数
在两个有序数组中分别找第k/2大的数,较小的那个数及其前面的数都被排除是第k大的可能,更新k,重复这个过程直到k==1。
其他
- AAA977. 有序数组的平方
原数组两端的绝对值大,中间越是靠近0,绝对值越小,绝对值由大到小遍历。 - AAA605. 种花问题
- 若左右两边都是0,则当前位置便可以是1,记录数量超过等于n就返回true。
技巧
给数组赋值
除基本类型的数组,其他类型的数组在赋值之前需要初始化,否则会报空指针异常。
集合List与数组互相转换 (仅限包装类型,基本类型不可以)
数组转集合List Arrays.asList()
String[] str1 = new String[]{"wd"};
List<String> stringList = Arrays.asList(str1);
集合List转数组 toArray()
String[] str2 = stringList.toArray(new String[stringList.size()]);
//参考“LeetCode57. 插入区间”的代码
List<int[]> list = new ArrayList<>();
list.toArray(new int[0][]);
Arrays.equals()
- ****438. 找到字符串中所有字母异位词
p,s各有一个词频数组,每遍历一个字符就去比较词频数组是否一致。
给一个数组排序却不变动原数组
新建一个数组idx存储原数组的下标,然后按照原数组的大小给idx排序。
如,下面的代码就是给nums2的下标排了序:
Integer[] idx = new Integer[n];
for (int i = 0; i < n; i++) {
idx[i] = i;
}
Arrays.sort(idx,(a,b)->(nums2[a]-nums2[b]));
构建List[]数组
List<Integer>[] adjoin = new List[n+1];