跳至主要內容

56(2)-数组中数字出现的次数

daipeng小于 1 分钟

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

对于出现三次的数字,二进制是一样的,二进制相应的位数相加一定是3,比如011,按照位数相加是033。那么我们可以将所有数字的二进制相加,不进位,然后对每一位对3求余,剩下的就是出现一次数字的二进制表示,这个可以扩展到其他数字出现若干次的问题。

 public int singleNumber(int[] nums) {
        int[] data = new int[32];
        for (int num : nums) {
            int m = 1;
            for (int i = 31; i >= 0; i--) {
                if((num & m ) == m){
                    data[i]++;
                }
                m = m << 1;
            }
        }
        for (int i = 0; i < 32; i++) {
            data[i] = data[i] % 3;
        }
        int result = 0;
//        for (int i = 31; i >= 0; i--) {
//            int value = data[i] == 0 ? 0 : data[i]  *  (int)Math.pow(2,31 - i);
//            result += value;
//        }
   //位运算性能好
        for (int i = 0; i < 32; i++) {
            result <<= 1;
            result |= data[i];
        }

        return result;
    }