给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

原题

示例 1:


输入: [2,2,3,2] 输出: 3



示例 2:


输入: [0,1,0,1,0,1,99] 输出: 99



思路分析:又又又又又来搞事情了。。。

相对于之前的只出现一次的数字一文中,还是原来的第一条思路,但是这次开的是一个map,所以就是简单的遍历加标记,记录数字出现次数,然后再遍历map寻找出现一次的数字,OK这题解决了。。。。。

BUT能不能用位运算解决呢?OF COURSE,thinking thinking,如果某个元素重复三次,那么相对应的二进制中的一之和是不是得3的倍数,而如果在某一时刻遇到了出现一次的元素,那岂不是对应的二进制为一的和不是3的倍数,所以找到不是3的倍数的二进制位置,异或一下就求出来啦。。详情看代码

class Solution {
    public int singleNumber(int[] nums) {
        
        int ans = 0;
        int[]temp = new int[33];
        for(int num:nums)
        {
            int r = 1;
            int j = 32;
            while(j >= 0)
            {
                if((num&r) != 0)temp[j]++;
                j--;
                r = r << 1; 
            }
        }
        int r = 1;
        int j = 32;
        
        while(j >= 0)
        {
            if(temp[j]%3 != 0)
                ans = ans ^ r;
            r = r << 1;
            j--;
        }
        
        return ans;
    }
}