美文网首页
二进制数运算 - LC136 Single Number

二进制数运算 - LC136 Single Number

作者: 风烨 | 来源:发表于2017-11-12 06:24 被阅读0次

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

        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

          本文链接:https://www.haomeiwen.com/subject/fecnmxtx.html