### 题目描述
给你一个整数数组 nums ,该数组具有以下属性:
nums.length == 2 * n.
nums 包含 n + 1 个 不同的 元素
nums 中恰有一个元素重复 n 次
找出并返回重复了 n 次的那个元素。
### 示例
示例1:
输入:nums = [1,2,3,3]
输出:3
示例 2:
输入:nums = [2,1,2,5,3,2]
输出:2
示例 3:
输入:nums = [5,1,5,2,5,3,5,4]
输出:5
提示:
2 <= n <= 5000
nums.length == 2 * n
0 <= nums[i] <= 104
nums 由 n + 1 个 不同的 元素组成,且其中一个元素恰好重复 n 次
### 解题思路
1、统计每个元素出现的次数,使用map存储,key是元素,value是元素出现的次数,统计完成后再判断每个元素出现的次数是否等于`nums.szie()/2`,如果是则返回该元素:
```C++
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class Solutaion {
public:
int repeatedNTimes(vector<int>& nums){
unordered_map<int, int> mp;
int size = nums.size();
for(int i = 0; i < size; i++) {
int num = nums[i];
auto ele = mp.find(num);
if(ele == NULL || ele == mp.end()){
mp.emplace(num, 1);
} else {
int val = ele->second + 1;
ele->second = val;
}
}
int ans = 0;
for(const auto& [key,value] : mp){
if(value == size / 2){
ans = key;
}
}
return ans;
}
};
int main(){
Solutaion solutaion;
vector<int> in = {1,2,2,2,5,6};
int ans = solutaion.repeatedNTimes(in);
std::cout << "ans is: " << ans << endl;
}
```
2、总元素数量为2n,不重复的元素个数为n+1,其中有一个元素出现n次,那么其他的元素有且仅会出现1次,即出现超过1次的元素必定出现n次,因此只需要返回重复出现的元素即可;
```C++
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
class Solutaion {
public:
int repeatedNTimes(vector<int>& nums){
unordered_set<int> found;
for (int num: nums) {
if (found.count(num)) {
return num;
}
found.insert(num);
}
// 不可能的情况
return -1;
}
};
int main(){
Solutaion solutaion;
vector<int> in = {1,2,2,2,5,6};
int ans = solutaion.repeatedNTimes(in);
std::cout << "ans is: " << ans << endl;
}
```
961. 在长度 2N 的数组中找出重复 N 次的元素