异或运算,看视频吧。AcWing 73. 数组中只出现一次的两个数字
https://www.acwing.com/solution/acwing/content/1324/
假设这2个数为x,y
1.对所有数进行异或,相同的2个数执行异或后的值为0。结果就是x⊕y.
2.异或运算的性质:.若a是二进制数0101,b是二进制数1011;则a⊕b=1110 ,只有在两个比较的位不同时其结果是1,否则结果为0。
可以肯定的是,x⊕y的结果有某一位k是1。利用第k位是1,将数组分成2类数组,数组m是Z=1,另一数组n是Z=0。
x和y分别在m、n中。
3.对m、n中的元素分别进行异或,可以得到x,y.
class Solution { public: vector<int> findNumsAppearOnce(vector<int>& nums) { int sum = 0; for(auto x : nums) sum ^=x; int k = 0; while(!(sum>>k & 1))k++; //k中存的是x异或y中某一位是1的那位 int first = 0; for(auto x: nums) if(x>>k&1) first ^= x;//对第k位为1的集合进行异或,求出第一个出现一次的数字x return vector<int>{first,sum^first};//sum^first,求出第二个出现一次的数字y } };