136. Single Number and与、或、异或、取反、左移和右移运算

来源:互联网 发布:手机直播源码教程 编辑:程序博客网 时间:2024/05/17 14:27

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?

my answer:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int b=0;
        for(int i=0;i<nums.size();i++)
        {
           b^=nums[i];
        }
        return b;
    }
};

注意事项:

此题相对来说并不难,但是如果不懂用异或运算的话就可能会把问题复杂化。

利用异或操作。异或的性质1:交换律a ^ b = b ^ a,性质2:0 ^ a = a。于是利用交换律可以将数组假想成相同元素全部相邻,于是将所有元素依次做异或操作,相同元素异或为0,最终剩下的元素就为Single Number。

异或运算:

& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

0 0