说明
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
题解
- 复杂度
- 时间O(n),空间O(1)
因为32是常数,并不会随着nums增大而增大
- 时间O(n),空间O(1)
- 统计数组里每个元素 二进制位 1的个数,如果是3的倍数,则最终结果该为是0,否则是1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27var singleNumber = function(nums) {
/*
1. 计算每二进制位
*/
let res = 0;
let mask = 1;
let lastNum = 0;
for(let i = 0;i<32;i++){
let cnt = 0;
for(let j = 0;j<nums.length;j++){
let cur = nums[j];
if((cur & mask)!==0){
cnt++;
}
}
//目标数字i位是0
if(cnt %3 == 0){
// middd<<=1;
// res = res + middd;
} else {//i位是1
lastNum = lastNum + mask;
}
//左移1位
mask<<=1;
}
return lastNum;
};
哈希map实现
- 复杂度
- 时间O(n),空间O(n)
- 遍历数组nums,将每个数出现的次数存到map里
- 遍历map,如果map.get(nums[i])为1,则return
1 | var singleNumber2 = function(nums) { |