算法标签:位运算

题目简叙

[LeetCode]剑指 Offer 56 - I. 数组中数字出现的次数_leetcode

思路

利用异或操作符

代码

class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
vector<int>res(2);
int k=0;
for(int it:nums)k^=it;
/*
//0^k
0^k = k

//不相等 不抵消
a ^ b
0011(3)
0101(5)
^ 0110(+)

//相等 不抵消
a ^ a
0011
0011
^ 0000
*/
k&=-k;
/*
k & (-k)
0000 0110
& 1111 1010(-s 补码)
0000 0010 //返回正码与补码共同存在的最后一个1,其他全部为0
*/

for(int it:nums)
it&k?res[0]^=it:res[1]^=it;
//利用k对it数值进行分组
//^= 相同抵消 0K=K 最后保存正确的值

return res;
}
};

AC记录

[LeetCode]剑指 Offer 56 - I. 数组中数字出现的次数_操作符_02