137. 只出现一次的数字 II

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

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

示例 2:

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

思路:

和之前的其他元素均出现两次相比,不能用异或的方法去得到该元素。其实相同的元素在某一位上面都是相同的,对于所有数字的某一位来说,那么必然是3n+1个二进制位,n为出现三次的元素数量,在3n+1中有3x个0,3y个1,x+y=n。

剩下一个目标元素不确定是0或者1。观察可以发现,如果目标元素在该位上为1,那么1的个数为3x+1模3之后余1,说明目标元素在该位上的值为1.根据这个特点可以通过遍历32次全数组构建出目标元素的值。

Code:

class Solution {  
public:  
    int singleNumber(vector<int>& nums) {  
        int length = nums.size();  
        int result = 0;  
        for(int i=0;i<32;i++)  
        {  
            int mask = 1<<i;  //从最低位开始
            int cnt = 0;  
            for(int j=0;j<length;j++)  
            {  
                if(mask & nums[j])  //统计有1的个数
                    cnt++;  
            }  
            if(cnt%3)  //不能整除说明在该位为1
                result |= mask;  
        }  
        return result;  
    }  
};  

猜你喜欢

转载自blog.csdn.net/xuxuxuqian1/article/details/80753952