剑指 offer 56-02 数组中唯一只出现一次的数字
位运算01
沿用位运算的思路。如果一个数字出现三次,那么它的二进制表示的每一位(0或1)也出现三次,如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被三整除。
把数组中所有数字的二进制表示的每一位加起来。如果某一位的和能被3整除,那么那个只出现一次的数字的二进制表示中对应的那一位就是0;否则就是1.
class Solution {
public int singleNumber(int[] nums) {
int[] bitSum = new int[32];
for(int n:nums){
int bitMask = 1;
for(int i=31;i>=0;i--){
int bit = bitMask&n;
if(bit!=0){
bitSum[i]++;
}
bitMask <<=1;
}
}
int res = 0;
for(int i=0;i<32;i++){
res = res<<1;
res+=bitSum[i]%3;
}
return res;
}
}
时间复杂度
O
(
n
)
O(n)
O(n),
空间复杂度
O
(
1
)
O(1)
O(1),需要一个长度为
32
32
32的辅助数组存储二进制表示的每一位的和。由于数组长度是固定的,因此空间效率是
O
(
1
)
O(1)
O(1)。
有限状态自动机
没看懂。。。。。