题目描述:找出数组中重复的数字
在一个长度为n的数组里的所有数字都在0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
解题要点:题目说所有数字在0~n-1,然后数组长度为n,意味着如果没有重复的数字,则0~n-1都会出现一次,也就是数组排序后元素值和数组下标相同。由于题意特殊:排序方式采用与下标相比较的方式。与下标相同,则向后比较,不同,则交换归位。
分析:一个萝卜 一个坑
1、首先看萝卜和坑是否对得上対得上,対得上往下看
2、对不上 看萝卜本来的坑是啥?
若是相同的萝卜,则有重复的数字
若是不相同,则两个萝卜对换
完整的代码:
#include<iostream>
#include<vector>
using namespace std;
int findRepeat(vector<int> &a){
int i = 0 , temp;
while(i < a.size()){
/* for(int i = 0 ; i < a.size() ; i ++){
cout << a[i] << " ";
}
cout << endl;*/
if(a[i] == i) i ++;
else{
if(a[a[i]] == a[i]) return a[i] ;
else{
temp = a[a[i]];
a[a[i]] = a[i];
a[i] = temp;
}
}
}
return -1;
}
int main(){
int n,temp,res;
vector<int> a;
cout << "n = " ;
cin >> n ;
cout << "a : " ;
for(int i = 0 ; i < n ; i ++){
cin >> temp;
a.push_back(temp);
}
res = findRepeat(a);
if(res != -1)
cout << "Repeat number is : " << res << "." << endl;
else
cout <<"No have Repeat number." ;
return 0;
}