面试题3(一):找出数组重复的数字

// 面试题3(一):找出数组中重复的数字
// 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,
// 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},
// 那么对应的输出是重复的数字2或者3。

解题思路:

从头到尾扫描数组,当扫描到下标为i的数字a[i]=m,

如果i=m,那么m就在他自己的位置上,继续下一个。

如果i!=m,说明m不在自己的位置a[m]上,

再比较a[m]和m,如果a[m]=m,说明m在下标为i和m的地方都出现了,找到一个重复数字,返回。

           如果a[m]!=m,说明m暂时只出现了一次,交换a[i]和a[m],把m放到自己的位置上。

不断重复这个过程,就可以找到一个重复的数字。

伪代码:

if (数组元素与长度参数不合规范){
    return false;
}

for (遍历数组每一个元素){
    while(a[i]!=i){
        if (a[i] == a[m]){
            a[i] 是重复数字,存储a[i] ;
            return true;
        }
        交换a[i] 和a[a[i]];    
    }   
}

c/c++代码:

bool duplication(int* numbers,int length,int* duplication){
    //空指针或者长度输入错误
    if(numbers==nullptr||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++){
        //numbers[i]不在正确位置
        while(numbers[i]!=i){
            //numbers[i]与numbers[numbers[i]]相等,重复元素寻找成功
            if(numbers[i]==numbers[numbers[i]]){
                *duplication=numbers[i];
                return true;
            }

            //numbers[i]与numbers[numbers[i]]不等,交换位置
            int temp=numbers[i];
            numbers[i]=numbers[temp];
            numbers[temp]=temp;
        }
    }
    return false;
}

测试代码:

参照参考资料

    

 

 

 

 

 

参考资料:

剑指offer源代码面试题3(一)

 

posted @ 2018-08-01 22:54  朕蹲厕唱忐忑  阅读(197)  评论(0编辑  收藏  举报