只出现一次的数字Ⅱ

137. 只出现一次的数字 II

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

1
2
输入:nums = [2,2,3,2]
输出:3

示例 2:

1
2
输入:nums = [0,1,0,1,0,1,99]
输出:99

提示:

  • 1 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

考虑答案的第 i 个二进制位(i 从 0 开始编号),它可能为 0 或 1。对于数组中非答案的元素,每一个元素都出现了 3 次,对应着第 i 个二进制位的 3 个 0 或 3 个 1,无论是哪一种情况,它们的和都是 3 的倍数(即和为 0 或 3)。因此:

答案的第 i 个二进制位就是数组中所有元素的第 i 个二进制位之和除以 3 的余数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int singleNumber(int[] nums) {
int ans = 0;
for(int i = 0; i < 32; i++){
//计算所有元素每个二进制的1的总和
int total = 0;
for(int x : nums){
//取每个元素最低位,然后右移
total += (x >> i) & 1;
}
if(total % 3 != 0){
ans |= (1 << i);
}
}
return ans;
}
}

只出现一次的数字Ⅱ
http://example.com/2023/06/22/算法/数学相关/14. 只出现一次的数字 II/
作者
PALE13
发布于
2023年6月22日
许可协议