剑指Offer56-II数组中数字出现的次数II

题目链接:剑指 Offer 56 - II. 数组中数字出现的次数 II

官方题解:面试题56 - II. 数组中数字出现的次数 II(位运算 + 有限状态自动机,清晰图解)

思路:数组中只有一个数字出现一次,其他数字出现三次,那么可以统计二进制各个位数上各自1出现的次数,然后模3,那么最后得到的二进制位数就是指出现过一次的数。

代码:

class Solution {
    public int singleNumber(int[] nums) {
        int[] counts = new int[32];
        for(int n : nums){
            for(int i=0; i<32; i++){
                int p = 1 << i;
                if((n & p) == p){
                    counts[31-i] ++;
                }
            }
        }
        int res = 0;
        for(int i = 0; i<32; i++){
            res <<= 1;
            res |= counts[i] % 3;
        }
        return res;
    }
}

ps:用map的方法比这更快点

原文地址:https://www.cnblogs.com/liuyongyu/p/14096842.html