题目链接
leetcode在线oj题——只出现一次的数字(2)
题目描述
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。
题目示例
输入:nums = [2,2,3,2]
输出:3
输入:nums = [0,1,0,1,0,1,99]
输出:99
题目提示
- 1 <= nums.length <= 3 * 104
- -231 <= nums[i] <= 231 - 1
- nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
解题思路
这道题让我们不能使用额外的空间,因此不能使用HashMap来统计字符的个数,然后返回其中只有一个的
在计算机中数字的存储都是二进制的,例如十进制的5对应二进制的101,十进制的4对应的二进制为100
我们可以统计数组中每个二进制位有几个元素,如果数组中有三个5,有一个4,那么就是403
显然,如果所有数字都是出现一次,那么每一个二进制为%3都是0,因此,我们只需要验证每一个二进制位%3是否为0,如果不是0,我们就把这一位记下来,统计所有二进制位%3不为0的位,最后统一还原为十进制位
统计二进制位使用下面这个算法:
sum += ((nums[j] >> i) & 1);
还原十进制位使用下面这个算法:
if(sum % 3 != 0){
result |= (1 << i);
}
代码
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for (int i = 0; i < 32; i++) {
int sum = 0;
for (int j = 0; j < nums.length; j++) {
sum += ((nums[j] >> i) & 1);
}
if(sum % 3 != 0){
result |= (1 << i);
}
}
return result;
}
}