核心思想(图文结合读):由于元素值在 [0,n-1] 区间内,最理想的状态是不是 0 在0号位置,1在1号位置?
那么我们可以遍历该数组,每一次判断第 i 个元素值 m 是否等于 i 本身(即上述逻辑)
如果相等说明该元素已经在理想的状态,continue
如果不相等,继续判断第 i 个元素值 m 是否等于该数组中 第 m 个位置的元素?
如果相等说明重复,返回元素
如果不相等则交换第 i 个元素和第m个元素的位置。
Java代码以下:
public int duplicate(int[] numbers){
// 遍历数组
for(int i=0;i<numbers.length;i++){
if(numbers[i] == i) // 第i个位置的元素就是i
continue;
else {
// 重点说明m: 第i个元素值就是 m , numbers[numbers[i]] 相当于 numbers[m]
if(numbers[i] == numbers[numbers[i]]) // 第i个元素与第m个位置元素相等,重复
return numbers[i];
else {
// 交换
int t=0;
t = numbers[numbers[i]];
numbers[numbers[i]] = numbers[i];
numbers[i] = t;
}
}
}
// 来到这说明没有重复的
return -1;
}