题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
方法一
已知数组为n,每一个数组都不超过n,根据这个条件,想要找出重复的数,我们可以新建一个boolean型数组,制作一张hash表,hash函数y=x,也就是将数组中的数作为Boolean型数组的下标值,相同的两个数在Boolean型数组中一定会有相同的下标。初始化Boolean型数组中的每一个元素为false,遍历数组中的每一个数,将数对应的下标所对应的boolean变为true,若角标对应的值已经为true,说明该数已经存在,保存即可。代码如下:
private static boolean duplicate(int[] numbers, int length, int[] duplication) {
boolean[] b=new boolean[length];
for (int i = 0; i < length; i++) {
if (b[numbers[i]]== false) {
b[numbers[i]] = true;
}
else
{
duplication[0] = numbers[i];
return true;
}
}
return false;
}
方法二:
直接利用java集合函数hashSet的特性,不允许存在重复元素。直接遍历数组,判断hashset集合中是否存在数组中的数,如果不存在,将数添加在集合中;若存在,输出该数,返回true即可。代码如下:
private static boolean duplicate(int[] numbers, int length, int[] duplication) {
HashSet< Integer> hashSet = new HashSet<Integer>();
for (int i = 0; i < length; i++) {
if (!hashSet.contains(numbers[i])) {
hashSet.add(numbers[i]);
}else {
duplication[0] = numbers[i];
return true;
}
}
return false;
}
总结
该题主要考察的还是对数组的理解,从效率上来讲,方法一效率更高。