73. 数组中只出现一次的两个数字
Posted 创造型快乐or享受型
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了73. 数组中只出现一次的两个数字相关的知识,希望对你有一定的参考价值。
异或运算,看视频吧。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 } };
以上是关于73. 数组中只出现一次的两个数字的主要内容,如果未能解决你的问题,请参考以下文章