62.数组中唯一只出现一次的数字
在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。
请找出那个只出现一次的数字。
你可以假设满足条件的数字一定存在。
思考题:
- 如果要求只使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?
数据范围:
数组长度 [1,1500]。
数组内元素取值范围 [0,1000]。
样例:
输入:[1,1,1,2,2,2,3,4,4,4]
输出:3
代码:
class Solution {
public int findNumberAppearingOnce(int[] nums) {
//创建一个32位的数组,用于统计每一位上1出现的总次数
int[] count = new int[32];
//遍历数组中的每个数字
for(int i = 0;i<nums.length;i++){
//对当前数字的每一位进行计算
//统计当前第k位是否为1,如果是则将结果加到count数组对应位置
for(int k = 0;k<32;k++)count[k]+=(nums[i]>>k)&1;
}
//初始化结果遍历
int res = 0;
//遍历count数组的每一位
for(int k = 0;k<32;k++){
//对每一位的计数结果对3取余(因为其他数字都出现3次)
//将余数左移k位恢复到原来的位置
//使用或运算将各位的结果组合起来
res|=(count[k]%3)<<k;
}
//返回最终结果
return res;
}
}