二进制数运算 - LC136 Single Number

开始看这道题,先想到的是存储所有数字和出现的次数然后找到唯一的那个数字。
接着想到可以先排序,比较一下奇偶是否相等,于是有了这样的解法

    public int singleNumber(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length -1;
        for(int i = 0; i < n; i+= 2){
            if( nums[i] != nums[i+1]) return nums[i];
        }
        return nums.length%2 == 0 ? 0 : nums[n];
    }

可是仔细回忆,总觉得还有最理想的方法,毕竟在找对称数字字符串的时候有用到二进制数字的32个位标志(a -> z)字母是否出现过。最后搜索了一下其他二进制的算法和参考了大家分享,才知道想起还有异或运算。不得不提醒,int在java里面是用32位二进制表示的。 基础类型转换参考

    public int singleNumber(int[] nums) {
        int x = 0;
        for(int i:nums) x ^= i;
        return x;
    }

说到这里,必须要复习一下二进制数的基本运算了。

//或
1010 & 0101 == 0000 
1100 & 0110 == 0100
//与
1010 | 0101 == 1111
1100 | 0110 == 1110
//取反
~1111 == 0000
~0011 == 1100
//异或(相同得1,不同得0)
1010 ^ 0101 == 1111
1100 ^ 0110 == 1010

二进制运算参考

你可能感兴趣的:(二进制数运算 - LC136 Single Number)