在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路:将数组对应的值交换到对应的位置;例如 2 交换到第2个位置,3交换到第3个位置;如果该位置上有对应的值,则重复;
1、判断输入数组有无元素非法
2、从头扫到尾,只要当前元素值与下标不同,就做一次判断,numbers[i]与numbers[numbers[i]],相等就认为找到了
重复元素,返回true,否则就交换两者,继续循环。直到最后还没找到认为没找到重复元素,返回false
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> arr;
int tmp;
for (int i = 0; i < n;i++){
cin >> tmp;
arr.push_back(tmp);
}
int num = arr.size();
for (auto x:arr){
if (x < 0 || x >= n){
cout << -1 << endl;
}
}
for (int i = 0; i < num;i++){
while (i != arr[i] && arr[arr[i]] != arr[i]){
swap(arr[i], arr[arr[i]]);
}
if (arr[i]!=i && arr[arr[i]]==arr[i])){
cout << arr[i] << endl;
break;
}
}
cout << -1 << endl;
return 0;
}
使用map
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> arr;
int tmp;
for (int i = 0; i < n;i++){
cin >> tmp;
arr.push_back(tmp);
}
int num = arr.size();
for (auto x:arr){
if (x < 0 || x >= n){
cout << -1 << endl;
}
}
map<int, int>m;
for (int i = 0; i < num;i++){
++m[arr[i]];
if (m[arr[i]]>1){
cout << arr[i];
break;
}
}
cout << -1 << endl;
return 0;
}