剑指offer面试题3:找出数组中重复数字

问题描述:在长度为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;
}

 

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值