LeetCode 137. 只出现一次的数字 II

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

说明:

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

示例 1:

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

示例 2:

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

链接:
 

位运算:
    逐位的去统计每一位上的1的个数,对于给定数组,只有一个数出现了一次,其他数都出现了3次,那么对于每一位上的1的个数来说,要么是1的3倍,要么是1的3倍 + 1. 而如果是3的倍数+1就说明只出现1次的数该位上为1. 如果是3的倍数,则说明只出现1次的数该位上应该为0.
class Solution {
public:
    int singleNumber(vector& nums) {
        int res = 0;
        for (int i = 0; i < 32; ++i){
            int sum = 0;
            for (auto x:nums){
                sum += (x >> i) & 1;  // 注意 sum = sum + (x >> 1) && 1; 这种写法是错误的,因为优先级的原因,会现去计算sum + (x >> 1),再去计算 && 1
            }
            res = res + ((sum % 3) << i);  // 同理(sum % 3) << i,要加上括号包围,提高优先级
        }
        return res;
    }
};

 

你可能感兴趣的:(Leetcode)