问题描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输出长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3.
思路解析
对于长度为n的数组,范围为0~n-1的数字而言,如果不粗在重复数字,则排序后数组元素和数组角标相同。如果存在重复数字,则在排序的过程中会出现不同下标对应相同数字的情况。
举例:
数组2310253,下标0对应的数字是2,数字2与下标0不一致,交换下标0和下标2对应的数字,交换后的结果为1320253;
数组1320253,下标0对应的数字是1,数字1与下标0不一致,交换下标0和下标1对应的数字,交换后的结果为3120253;
数组3120253,下标0对应的数字是3,数字3与下标0不一致,交换下标0和下标3对应的数字,0123253。
数组0123253,下标4对应的数字是2,下标2对应的数字也是2,下标4对应的数字是重复数字。
代码实现
bool cTest::duplicate(int *num, int len, int &val)
{
if (num == nullptr || len <= 0)
return false;
for (auto i = 0; i < len; ++i)
if (num[i] < 0 || num[i] > len - 1)
return false;
for (auto i = 0; i < len; ++i)
{
while (num[i] != i)
{
if (num[i] != num[num[i]])
{
auto temp = num[i];
num[i] = num[temp];
num[temp] = temp;
}
else
{
val = num[i];
return true;
}
}
}
return false;
}