**题目描述:**在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
解题思路:
引入一个哈希表用于记录每个数字的出现情况,如果数字未出现过,则pass,如果数字出现过,则直接输出
代码:
int len = numbers.length;
// if (len <= 1) {
// return -1; // 最后有一个兜底返回-1了,所以这里没有必要了
// }
HashMap<Integer, Integer> record = new HashMap<>(); // 这里需要注意的是要使用封装类Integer,而不能用int
// Map<Integer,Integer>record = new Map<>(); // java的工具类中的map,一般用hashmap, 普通的map需要重新实现方法才行
for (int i = 0; i < len; i++) {
if (record.containsKey(numbers[i])) { // 如果没有出现过,就加入hash表
record.put(numbers[i], 1);
} else { // 否则就是第二次出现了,直接返回
return numbers[i];
}
}
return -1;
总结:
- 复杂度
时间复杂度O(n)——只需要最多遍历一遍数组
空间复杂度O(n)——引入了哈希表 - 知识点
数组的常用属性:
array.length: 得到数组长度
其他都是一些流式操作的高级用法,刷题时无需过多关注
哈希表常用属性如下:
刷题时常用的一般也就containsKey()、get()、 put()、size()