leetcode 137. 只出现一次的数字 II(位运算)-golang版本 | Go主题月

207 阅读1分钟

给你一个整数数组 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)
}