leetcode每日一题:
解法 1: 哈希表
标准解法 , 利用哈希表映射 , 也是计数排序.
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
unordered_map<int , int>un_map;
vector<int>re;
for(auto ao : nums) un_map[ao] ++;
for(auto ao : un_map) if(ao.second == 1) re.push_back(ao.first);
return re;
}
};
解法 2: 位运算异或 . 空间复杂度: O(1) , 时间复杂度: O(n).
异或 (xor): 二进制表示下 , 相同为0 , 相异为1. 所以存在偶数个的数值异或为 0.
由题意可以知道 , 数据只存在两个存在 1 次的数字 , 其余的数字也只存在 2 次 (偶数次) , 那我们如果将全部的数 xor 起来 , 得到的结果就是那两个只存在一次的数字的 xor 值. 接下来要做的就是如何将这两个数字分开. 因为两个不同的数字 xor 一定不为0 , 所以二进制下会有一位为 1. 这对应着 , 这两个数在该位上一定有一个为 0 , 一个为 1. 所以我们就可以利用这个条件将这两个数 (将这个位上分别为1 , 0 的数分开 , 由于其余的数都为偶数个 , 所以 xor 一样不产生影响) 分开了.
lowbit() 函数: (xor) & (- xor) , 从右到左取最后一位 1 的二进制大小数. ( 利用二进制观察更加直观.
eg:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
long XOR = 0;
for(auto ao : nums) XOR ^= ao;
int ide = (XOR) & (- XOR);
int first = 0 , second = 0;
for(auto ao : nums){
if(ao & ide) first ^= ao;
else second ^= ao;
}
return {first , second};
}
};
Day Eight -- 惊鸿照影来.