您的位置:首页 > 职场人生

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

2018-08-01 22:54 471 查看
版权声明:欢迎转载,转载时还请在末尾注明本文章及参考资料的链接。 https://blog.csdn.net/qq_33296651/article/details/86168272

// 面试题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放到自己的位置上。

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

伪代码:

[code]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++代码:

[code]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 朕蹲厕唱忐忑 阅读(...) 评论(...) 编辑 收藏

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: