方法一:找内在规律,抓住长度为n,里面的数据的值在0-n-1之间
1.先判断a[i]==i;等于i就跳过去,i++即可
2.若a[i]!=i,先比较a[i]和a[a[i]]是否相等,相等的话,就找到了,返回true就行。
3.若a[i]和a[a[i]]不相等,两者交换位置
其实这3步做的目的就是尽量使i位置的值a[i]=i;
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;
}
// swap numbers[i] and numbers[numbers[i]]
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
return false;
}
方法二:
bool find_same2(int a[],const int length)
{
if (length <= 0 || a == NULL)
{
return 1;
}
for (int i = 0;i<length;i++)
{
if (a[i]>=length || a[i]<0)
{
return 1;
}
}
set<int> Temp;
int flag = -1;
for (int i = 0;i<length;i++)
{
if (Temp.find(a[i]) == Temp.end())
{
Temp.insert(a[i]);
}
else
{
if (a[i] != flag)
{
cout<<a[i]<<" ";
}
flag = a[i];
}
}
return 0;
}
这个会输出所有重复的数字