题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
思路:因为数字在0到n-1的范围,如果没重复的话,下标应该和所指的值相等。所以我们可以从第一个数开始找它相对应的下标。例:{2,3,1,0,2,5,3},从2开始,2应该移到下标为2的位置,也就是和1交换,然后1和3交换,3和0交换。。以此类推,直到发现所在下标的值和即将交换的值一样。
#include<iostream>
using namespace std;
bool duplicate(int numbers[], int length, int* duplication)
{
if (numbers == NULL || 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 (numbers[i] == numbers[numbers[i]]) //即将交换的数和已存在的数相等,也就是重复了
{
*duplication = numbers[i];
return true;
}
//不相等则继续交换
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
return false;
}
int main()
{
int a[7] = {6,3,1,0,2,5,3};
int dup;
bool result = duplicate(a, 7, &dup);
if (result = true)
{
cout << dup << endl;
}
return 0;
}