feat(Go-Tool):2021/03/18:新增超过半数数字系列算法题,新增出现次数不同的数字系列算法题

This commit is contained in:
Huangzj
2021-03-18 15:55:40 +08:00
parent 8dbfebe5be
commit 00ada130fa
14 changed files with 441 additions and 0 deletions
@@ -0,0 +1,53 @@
/*
* @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)
}