给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,99]
输出:99
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
解题思路
因为除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 ,将所有元素的二进制排成一列对齐,其中每一列(即相同二进制位)出现的1的次数只可能是3的倍数或者是3的倍数加一。
为什么是3的倍数或者是3的倍数加一?
因为数组由2部分组成,n个三元组(相同的3个元素)和一个独立的元素,因为相同元素相同二进制位的数值是一样的,因此可能产生的是3m(n>=m)个1(如果独立的那个元素该位是0),也可能独立的那个元素该位也是1,因此可能产生的是3m+1(n>=m)个1。
因此凭借1的个数,就可以推出独立元素所有为1的二进制位,从而还原出独立的那个元素
代码
func singleNumber(nums []int) int {res:=int32(0)for i := 0; i < 32; i++ {//检查每个二进制位c:=int32(0)for _, num := range nums {c+=int32(num)>>i&1}if c%3>0{//还原独立的元素res|=1<<i}}return int(res)
}