问题描述:在长度为n的数组中存储的数字的范围为0——n-1,数组中右边重复数字,但是不知道是哪些数字重复也不知道重复几次,找出数组中的重复数字。
方法一思路:将数组先排序,再遍历数组依次找出重复数字
方法二思路:利用哈希表(消耗额外空间)。遍历数组,查找在哈希表中是否有这个数字,没有就将数字加入哈希表中,有了就说明此数字为重复数字。
方法三思路:利用数组下标和数字一对一(0号位置就用来存储数字0.会出现的情况是:①数组的某位置为空②数组的某位置恰好是与数组下标值相同的数字(会有重复出现的情况,因为数组中有重复数字)
我的疑惑:当出现比如说数字0不存在的时候,就会一直满足n[0]!=0,那while循环不就一直满足循环条件,不就退不出循环了么?
我的解答:while循环一定会停止,因为不存在满足循环条件的时候永远遇不到数组中有重复数字这一情况。数字0不存在就说明数字0的位置被另一个数字占了,那么这个数字一定是重复数字,所以在循环多次之后一定可以找出这个重复数字,最终return true结束while循环。
#include<cstdio>
bool duplicate(int n[],int len,int* duplication)
{
//关于特殊情况的判断
if(n==NULL||len<0)
return true;
//数组中的数字是否合规
for(int i=0;i>len;++i)
{
if(n[i]<0||n[i]>len-1)
return false;
}
//数组中是否有重复数字
for(int i=0;i<len;++i)
{
while(n[i]!=i)
{
int num=n[i];
if(n[num]==num)
{
*duplication=num;
return true;
}
else
{
int tmp=n[num];
n[num]=n[i];
n[i]=tmp;
}
}
}
return false;
}