题目描述:给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
示例 1:
输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
提示:
2 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
除两个只出现一次的整数外,nums 中的其他数字都出现两次
解题思路:
(1)利用哈希表存储数据出现的次数,每遍历一个数据则hash[num]++;
(2) 遍历哈希表,输出值(value)为1的键(key)
代码:
#include<iostream>
#include<unordered_map>
using namespace std;
class Solution {
public:
unordered_map <int, int>hash;
vector<int> singleNumber(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
hash[nums[i]]++;
}
vector<int> res;
for (auto h : hash) {
if (h.second == 1)
res.push_back(h.first);
}
return res;
}
};
int main() {
Solution solution;
vector<int> res,nums;
int num;
while (1) {
cin >> num;
nums.push_back(num);
if (cin.get() == '\n')
break;
}
res = solution.singleNumber(nums);
for (int i : res) {
cout << i << " ";
}
return 0;
}
进阶版:使用异或位运算
前序知识:异或,0与任何数字异或都是它本身,一个数与自身异或为0
剩下的:略