只出现一次的数字II
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
示例 1:
codeType
输入:nums = [2,2,3,2]
输出:3
示例 2:
codeType
输入:nums = [0,1,0,1,0,1,99]
输出:99
提示:
- 1 <= nums.length <= 3 * 104
- -231 <= nums[i] <= 231 - 1
- nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
解法
简单的做法是用hash表,但是需要O(n)空间复杂度。下面的做法只需要常数级别复杂度。
ts
function singleNumber(nums: number[]): number {
// 其余元素都恰出现2次的时候,可以用异或进行解题
// 这题异或操作就解决不了了。
// 可以32位逐位计算,该位置的所有1相加后 % 3 就是该位置的结果
let res = 0
for(let i = 0; i < 32; i++){ // 逐位计算
let total = 0
nums.forEach(num => {
total += ((num >> i) & 1) // 取第i位数字
})
if(total % 3 === 1){
res |= (1 << i) // ans的第i位置1
}
}
return res
};