题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。分析
因为找出任意一个重复的数字,所以排序,然后找出第一个跟后面的元素相等的元素输出就是返回结果。
当然,也有比较高端一点的,因为数组中所有的数字都在0-1的范围内,所以如果没有重复的数字的话,数组中的元素应该刚刚好为0~n-1,否则的话,我们对数组进行重排,对于元素numbers[i],如果numbers[i]==i,扫描下一个;否则,numbers[i]和numbers[numbers[i]]比较,如果相等,就找到了一个重复的数字,如果不等,交换numbers[i]和numbers[numbers[i]]的值,继续比较。(但是,我觉得这个比较麻烦没有必要这么做,而且容易超时)主要代码见代码2代码
bool duplicate(int numbers[], int length, int* duplication) {
if(length==0)
return false;
else{
sort(numbers,numbers+length);
for(int i=0;i<length-1;i++){
if(numbers[i]==numbers[i+1]){
*duplication=numbers[i];
return true;
}
}
return false;
}
}
};
- 代码2
bool duplicate(int numbers[], int length, int* duplication) {
for(int i=0;i<length;i++){
while(number[i] == i){
if(numbers[i] == numbers[numbers[i]]){
*duplication = numbers[i];
return true;
}
int temo=numbers[i];
numbers[i] = numbers[numbers[i]];
numbers[numbers[i]]=temp;
}
}
return false;
}