题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路
/**
* 思路:不需要重复比较或者是用Hash数组,题目已经限制数字是在0到n-1之间
* 只需要遍历一遍数组,吧出现过的数字减去n,(有人用+n可能会溢出),就可以甄别,哪一些是出现过的
*/
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
for(int i = 0; i < length; i++){
//首先发现数字已经被减过了,小于0,就先还原一下
int orginnum = numbers[i];
if(orginnum < 0) orginnum += length;
//然后对是否是曾经重复的数做出判断,是的话就得出结果
if(numbers[orginnum] < 0){
*duplication = orginnum;
return 1;
}
//如果不是重复过的数字,那就处理一下这个数字对应编号所在的数字
numbers[orginnum] -= length;
}
return 0; //如果没找到,就返回false
}
};