第一次写的会有死循环,因为在交换的过程中可能就会出现有相同的情况。第一次写的是都交换完了再比较,应该是交换的过程中比较:
错误的:
for ( i = 0; i < length; i++)
{
if (numbers[numbers[i]] == numbers[i] && numbers[i] != i)
{
break;
}
else
{
while (numbers[i] != i)
{
int temp = numbers[numbers[i]];
numbers[numbers[i]] = numbers[i];
numbers[i] = temp;
}
}
}
正确的:
bool duplicate(int numbers[], int length, int* duplication) {
if(length<=0||numbers==NULL)
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[numbers[i]] == numbers[i])
{
*duplication = numbers[i];
return true;
}
else
{
int temp = numbers[numbers[i]];
numbers[numbers[i]] = numbers[i];
numbers[i] = temp;
}
}
}
return false;
}