给定一个数组,其中只有一个数出现一次,别的数都出现3次,找出这个数(go)

1.思路

用两个数one=0、two=0分别记录bits位上1出现的次数,如果一个数出现一次,则one等于这个数,two=0;  如果一个数出现两次,则two等于这个数, one等于0;如果一个数出现第三次,则one = 0, two = 0 ,three等于这个数。

我们以数组{2, 1, 2, 2}为例:

初始: one = 0, two = 0 three

a. 数字2加入其中,则 one = 10(对应的10进制为2),two = 0

b. 数字1加入其中,则one = 11(对应的10进制为3),two = 0,  two等于0表明前面两个数字没有重复的位

c. 数字2加入其中, 则one = 1(对应的10进制为1), two = 10(对应的10进制为2), two等于2表明前面三个数字有重复的位

d.数字2加入其中,则one =  11 (对应的10进制为3), two = 10(对应的10进制为2), three = one & two = 10(十进制为2),表明有数字位重复出现3次,one = one & (^three), two = two &(^three),去掉one和two中与three相同的位,即去掉了出现3次的数字

算法: one = 0 two = 0 three

two |= one & t

one ^= t

three = one & two

one &= (^three)     如果用python,则该处对应的是 one &= (~three)

two &= (^three)     如果用python,则该处对应的是 two &= (~three)

 

代码如下:

func singleNumber(nums []int) int {
	var one = 0
	var two = 0
	var three int
	for i:= 0; i < len(nums); i++ {
		temp := nums[i]
		two |= one & temp
		one ^= temp
		three = one & two
		one &= ^three
		two &= ^three
	}
	return one
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值