【Offer】[56-2] 【数组中唯一只出现一次的数字】

题目描述

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

[牛客网刷题地址]无

思路分析

  如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则就是1。

测试用例

  1. 功能测试:唯一只出现一次的数字分别是0、正数、负数;重复出现三次的数字分别是0、正数、负数。

Java代码

public class Offer056_02 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        
    }

    public static int findNumberAppearingOnce(int[] array) {
        return Solution1(array);
    }


    private static int Solution1(int[] array) {
        if(array==null || array.length<=0) {
            return -1;
        }
        
        int[] bitSum = new int[32];
        for(int i=0;i<array.length;i++) {
            int bitMask = 1;
            for(int j=31;j>=0;j--) {//将每个数字的每一位存储到bitSum中,并且对应的位相加
                int bit = array[i] & bitMask;
                if(bit!=0) {
                    bitSum[j]+=1;
                }
                bitMask = bitMask<<1;
            }
        }
        
        int result =0;
        for(int i=0;i<32;i++) {
            result = result<<1;
            result += bitSum[i]%3;
        }
        
        return result;
    }

    private static void test1() {
        int[] array = {1,1,1,4,5,4,4,2,2,2};
        System.out.println(findNumberAppearingOnce(array)); 
    }

    private static void test2() {

    }
    private static void test3() {

    }

}

代码链接

剑指Offer代码-Java

猜你喜欢

转载自www.cnblogs.com/haoworld/p/offer562-shu-zu-zhong-wei-yi-zhi-chu-xian-yi-ci-de.html
今日推荐