剑指offer56-1

tech2022-10-04  69

剑指offer56-1

// 使用unordered_set插入和删除元素,最后仅出现过一次的元素被保留到哈希表中 class Solution { public: vector<int> singleNumbers(vector<int>& nums) { unordered_set<int> res; int len = nums.size(); for(int i=0;i<len;i++){ if(res.count(nums[i])) res.erase(nums[i]); else res.insert(nums[i]); } vector<int> v; for(auto cur:res) v.push_back(cur); return v; } }; // 先一遍异或得到这两个只出现一次的元素的异或值div // 一个while循环得到异或值二进制表示的首位1,即div // 再遍历一遍,以该位是否为1将数组元素分成两组,分别异或,得到a,b即为所求 class Solution { public: vector<int> singleNumbers(vector<int>& nums) { int ret = 0; for (int n : nums) ret ^= n; int div = 1; while ((div & ret) == 0) div <<= 1; int a = 0, b = 0; for (int n : nums) if (div & n) a ^= n; else b ^= n; return vector<int>{a, b}; } };
最新回复(0)