给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2] 输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,100] 输出:100
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
进阶:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
解题思路
将nums内的数转化成二进制,我们可以知道,二进制位上每一位的结果和对3取余,可以得到最终结果res该二进制位上的值。因为每三个相同的数该位上的和只可能为3或者0。
(item >> i) & 1即二进制倒数i位上的值,count将它们相加,对3取余之后,如果不等于0,则将它转化为十进制数加进最终结果。
由于我们是通过计算二进制位转化的十进制数相加,加数与被加数不会在相同的二进制位有重复值,因此可以使用|或运算来代替+。
代码
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let res = 0
for (let i = 0; i < 32; i++) {
let count = 0
for (let item of nums) {
count += (item >> i) & 1
}
if (count % 3 !== 0) {
res |= (1 << i)
}
}
return res
};