题目描述
在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几次,请找出任意一个重复的数字。例如,数组是[2,3,1,0,2,5,3],那么重复的数字可以是2或者3.
解题思路
在原数组里从头到尾进行扫描,当扫描到下标为i的数字(设为m)时,首先比较m是不是等于i。如果是则扫描下一个数字;如果不是则再拿它和第m个数字相比,如果它和第m个数字相等就找到了一个重复的数字;如果它和第m个数字不相等,就把第i个数字和第m个数字交换,把m放到属于它的位置。接下来重复这个比较、交换的过程,直到我们发现第一个重复的数字。
代码实现
bool duplicate(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)
{
while(numbers[i] != i)
{
if(numberrs[i] == numbers[numbers[i]])
{
*duplication = numbers[i];
return true;
}
swap(numbers[i], numbers[numbers[i]]);//交换两个值
}
}
return false;
}