[LeetCode]剑指 Offer 56 - I. 数组中数字出现的次数
原创
©著作权归作者所有:来自51CTO博客作者LibreCoder的原创作品,请联系作者获取转载授权,否则将追究法律责任
算法标签:位运算
题目简叙
![在这里插入图片描述 [LeetCode]剑指 Offer 56 - I. 数组中数字出现的次数_leetcode](https://s2.51cto.com/images/blog/202303/20141734_6417fa7e99b3e67780.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
思路
利用异或操作符
代码
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](https://s2.51cto.com/images/blog/202303/20141734_6417fa7ed797e15388.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)