面试题3:找出数组重复的数字
Posted boqianliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题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; }
测试代码:
参照参考资料
参考资料:
以上是关于面试题3:找出数组重复的数字的主要内容,如果未能解决你的问题,请参考以下文章
面试题3:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为