题解 | #数组中重复的数字#
数组中重复的数字
http://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524
思路
根据题意,找出重复的数字,很明显这是一个统计问题,大部分统计问题都可以用hash表来解决,但该题的本意并不是单纯考查hash表的用法,而是对hash表为啥可以快速查找的底层原理进行简单的考查,所以本题更优的做法是自己写一个简单的hash表完成该题。
方法一 直接用HashSet
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// write code here
HashSet<Integer> set = new HashSet<>();
for(int i = 0; i < numbers.length; i++) {
if(set.contains(numbers[i])) {
return numbers[i];
}else{
set.add(numbers[i]);
}
}
return -1;
}
}
方法二(自己写一个简单hashset)
hash表的底层原理可以想象成在空间中有N个桶子用来装存进去的对象,但是在存数的时候有一定规则,用对象的hashcode值对N求余数,余数就对应着对象应该存入第几个桶子。用这种方法,当要查询某对象是否在hashset里时,只需要对象的hashcode的值对N求余数,最后根据余数去对应的桶子取对象即可,时间复杂度为O(1) 根据这一原理,创建数组大小为N的数组来统计重复元素,代码如下
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// write code here
int[] set = new int[numbers.length];
for(int i = 0; i < numbers.length; i++) {
int index = numbers[i] % numbers.length;
if(set[index] == 1) {
return numbers[i];
}else{
set[index] = 1;
}
}
return -1;
}
}