题目描述
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
思路:
从头到尾依次扫描这个数组中的每个数字。当扫描到下标为i的数字时,首先比较这个数字(用m表示)是不是等于i。如果是,则接着扫描下一个数字:如果不是,则再拿它和第m个数字进行比较。如果它和第m个数字相等,就找到了一个重复的数字(该数字在下标i和m的位置都出现了);把m放到属于它的位置。接下来再重复这个比较、交换的过程,直到我们发现了一个重复的数字。
public boolean duplicate(int a[],int length,int [] duplication) {
//判断给定的数组是否为空
if(a==null){return false;}
//如果数组大小为0或1,则不可能有重复的数字
if(a.length<2){
return false;
}
int len = a.length;
//一次遍历
for(int i=0;i<len;i++){
//如果下标为i的元素不为i
if(a[i]!=i){
//判断以当前元素作为下标的元素和当前元素做比较,相等的话则找到了重复的元素,赋值并返回
if(a[i]==a[a[i]]){
duplication[0] = a[i];
return true;
}else{
//否则交换两个元素的位置,使下标为a[i]的元素上一定是a[i]
int temp = a[i];
a[a[i]] = a[i];
a[i] =temp;
}
}
}
return false;
}