54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
|
|
/*
|
|||
|
|
* @Author : huangzj
|
|||
|
|
* @Time : 2021/3/16 21:53
|
|||
|
|
* @Description:
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
package NumberCount
|
|||
|
|
|
|||
|
|
type OnlyOneNumberOtherThreeObj struct{}
|
|||
|
|
|
|||
|
|
func (*OnlyOneNumberOtherThreeObj) Doc() string {
|
|||
|
|
return `
|
|||
|
|
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
|
|||
|
|
要求:线性时间复杂度。 不使用额外空间来实现
|
|||
|
|
`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func OnlyOneNumberOtherThree1(numList []int) int {
|
|||
|
|
bitList := make([]int, 32)
|
|||
|
|
|
|||
|
|
for _, num := range numList {
|
|||
|
|
for i := 0; i < 32; i++ {
|
|||
|
|
bitList[i] += (num >> i) & 1
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res := 0
|
|||
|
|
|
|||
|
|
for i := 0; i < 32; i++ {
|
|||
|
|
if bitList[i]%3 != 0 {
|
|||
|
|
res += 1 << i
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return res
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//通过二进制的方式,本质上就是要构造一个相应的回路,即出现num的次数分别从1~3应该是 01 -> 10 -> 00 ...
|
|||
|
|
func OnlyOneNumberOtherThree2(numList []int) int {
|
|||
|
|
|
|||
|
|
var a uint
|
|||
|
|
var b uint
|
|||
|
|
|
|||
|
|
//第一次出现num计算的结果 a = num ,b = 0
|
|||
|
|
//第二次出现num计算的结果 a = 0 ,b = num
|
|||
|
|
//第三次出现num计算的结果 a = num ,b = 0
|
|||
|
|
//因此直接返回a即可
|
|||
|
|
for _, num := range numList {
|
|||
|
|
a = a ^ uint(num)&(^b)
|
|||
|
|
b = b ^ uint(num)&(^a)
|
|||
|
|
}
|
|||
|
|
return int(a)
|
|||
|
|
}
|