剑指 Offer 56 - II. 数组中数字出现的次数 II
难度: m i d d l e \color{orange}{middle} middle
题目描述
在一个数组 n u m s nums nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1
限制:
- 1 < = n u m s . l e n g t h < = 10000 1 <= nums.length <= 10000 1<=nums.length<=10000
- 1 < = n u m s [ i ] < 2 3 1 1 <= nums[i] < 2^31 1<=nums[i]<231
算法
(位运算)
考虑数字的二进制形式,对于出现三次的数字,各 二进制位 出现的次数都是 3 的倍数。
因此,统计所有数字的各二进制位中 1 的出现次数,并对 3 求余,结果则为只出现一次的数字
以二进制形式看待数据,只有一个数出现了一次,其他数都出现了三次
将每一位为1的位累加,再%3,就是只出现一次的数。
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组的长度。
-
空间复杂度 : O ( 1 ) O(1) O(1)
C++ 代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> a(32);
for (int num : nums) {
for (int i = 0; i < 32; i ++)
if ((num >> i & 1) == 1) a[i] = (a[i] + 1) % 3;
}
int res = 0;
for (int i = 0; i < 32; i ++) {
if (a[i] == 1) res = res | (1 << i);
}
return res;
}
};