写在前面:
这道题,我们首先要注意的就是数组numbers中的数字在0-n-1之间,我们就可以利用这个特点,建立一个辅助的数组hash,数组长度为n,也就是说:
(1)hash数组的下标,就可以用来记录numbers的元素,0-n-1。
(2)hash数组的下标对应的值,就可以用来记录numbers的元素出现的次数。
注意:
因为这道题,只要找出一个重复的元素就可以,不要求这个元素是否为第一个出现。
代码实现如下:
public boolean duplicate(int numbers[], int length, int[] duplication) {
if (numbers == null) {
return false;
}
for (int i = 0; i < length; i++) {
if (numbers[i] < 0 || numbers[i] > length - 1) {
return false;
}
}
// 利用数组的数字不超过n-1的特性,创建一个hash数组
// hash数组的下标记为0-n-1,下标对应的值,则是出现的次数
int[] hash = new int[length];
for (int i = 0; i < length; i++) {
hash[numbers[i]]++;
}
for (int i = 0; i < length; i++) {
if (hash[i] > 1) {
duplication[0] = i;
return true;
}
}
return false;
}