异或运算&位运算
2020-04-28 本文已影响0人
锦绣拾年
【想转Java刷算法题 不知道合不合适= = 也可以先不转 先看书】
任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0=a⊕0=a。
任何数和其自身做异或运算,结果是 0,即 a ⊕ a=0 a⊕a=0。
异或运算满足交换律和结合律,即 a⊕ b⊕a=b ⊕a ⊕ a=b ⊕(a ⊕ a)=b ⊕0=b a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/single-number/solution/zhi-chu-xian-yi-ci-de-shu-zi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相同的还有LC136
LeetCode刷题 木有写出来,涉及异或 Mark学习
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
限制:
2 <= nums <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
//遍历一遍就能找到
int a=0;
vector<int> res;
for(int i=0;i<nums.size();i++){
a^=nums[i];
}//异或结果一定是b异或c,两个数
int b=0;
int c=0;
//涉及到分组,如何分
int x=1;
while((x&a)==0){//两个位数相同,&按位与,必须用&
//两个不同的数,必然有不同的一位,那么这一位为1。找到不同的一位
x<<=1;
}
//找到两个位不同的
for(int i=0;i<nums.size();i++){
if(x&nums[i]){//这里也要按位与 不同的那一位为1的,分为一组
b^=nums[i];
}else{//不同那一位为0的,分为一组
c^=nums[i];
}
}
res.push_back(b);
res.push_back(c);
return res;
}
};