题目
2.1.23 Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
Note: Your algorithm should have a linear runtime complexity. Could you implement it without using
extra memory
翻译
一个数组中有一个元素出现了一次,其他都出现了两次,找到这个元素,要求不使用额外的空间,线性时间复杂度
分析
两个相同的数字异或得0,一个数字和0异或结果是它本身。只要偶数次都可以清零
class Solution {
public:
int singleNumber(vector<int>& nums) {
int x = 0;
for (auto i : nums) {
x ^= i;
}
return x;
}
};
class Solution {
public:
int singleNumber(vector<int>& nums) {
return accumulate(nums.begin(), nums.end(), 0, bit_xor<int>());
}
};
位运算
位运算
1、左移 “<<”
x << y。将x左移y位,将x最左边的y位丢弃,在右边补y个0。
2、右移 “>>”
将x右移y位,这需要区分x是有符号数还是无符号数。在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0。在x是有符号数时,又分为x是正数还是负数。正数时,同无符号数的处理相同;负数时,将将x的最右边的y位丢弃,在左边补上y个1。
3、与 “&”
如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
4、或 “|”
如果两个相应的二进制位只要有一个是1,结果就是1;否则为0
5、非 “~”
取反 0变1,1变0
6、异或 “^”
两个相同的数会变成0,反之是1