// 面试题3(一):找出数组中重复的数字
// 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,
// 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},
// 那么对应的输出是重复的数字2或者3。
解题思路:
从头到尾扫描数组,当扫描到下标为i的数字a[i]=m,
如果i=m,那么m就在他自己的位置上,继续下一个。
如果i!=m,说明m不在自己的位置a[m]上,
再比较a[m]和m,如果a[m]=m,说明m在下标为i和m的地方都出现了,找到一个重复数字,返回。
如果a[m]!=m,说明m暂时只出现了一次,交换a[i]和a[m],把m放到自己的位置上。
不断重复这个过程,就可以找到一个重复的数字。
伪代码:
if (数组元素与长度参数不合规范){
return false;
}
for (遍历数组每一个元素){
while(a[i]!=i){
if (a[i] == a[m]){
a[i] 是重复数字,存储a[i] ;
return true;
}
交换a[i] 和a[a[i]];
}
}
c/c++代码:
bool duplication(int* numbers,int length,int* duplication){
//空指针或者长度输入错误
if(numbers==nullptr||length<=0){
return false;
}
//数组元素不合要求
for(int i=0;i<length;i++){
if(numbers[i]<0||numbers[i]>length-1){
return false;
}
}
//输入合法,开始寻找
for(int i=0;i<length;i++){
//numbers[i]不在正确位置
while(numbers[i]!=i){
//numbers[i]与numbers[numbers[i]]相等,重复元素寻找成功
if(numbers[i]==numbers[numbers[i]]){
*duplication=numbers[i];
return true;
}
//numbers[i]与numbers[numbers[i]]不等,交换位置
int temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
}
}
return false;
}
测试代码:
参照参考资料
参考资料: