力扣https://leetcode-cn.com/problems/w3tCBm/
给定一个非负整数 n
,请计算 0
到 n
之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
func addBinary(a string, b string) string {
alength:=len(a)
blength:=len(b)
res:=make([]int,0,0)
var last int
for alength>=1&&blength>=1{
ai,_:=strconv.Atoi(string(a[alength-1]))
bi,_:=strconv.Atoi(string(b[blength-1]))
tmp:=ai+bi+last
if tmp==3 {
res = append(res,1)
last = 1
}else if tmp==2{
res = append(res,0)
last = 1
}else{
res = append(res,tmp)
last = 0
}
alength--
blength--
}
for alength>=1{
ai,_:=strconv.Atoi(string(a[alength-1]))
tmp:=ai+last
if tmp==2{
res = append(res,0)
last = 1
}else{
res = append(res,tmp)
last = 0
}
alength--
}
for blength>=1{
bi,_:=strconv.Atoi(string(b[blength-1]))
tmp:=bi+last
if tmp==2{
res = append(res,0)
last = 1
}else{
res = append(res,tmp)
last = 0
}
blength--
}
if last!=0{
res = append(res,last)
}
var str string
for i:=len(res)-1;i>=0;i--{
str = str + strconv.Itoa(res[i])
}
return str
}
func getOneNum(a string)int{
var res int
for i:=0;i<len(a);i++{
if a[i]=='1'{
res++
}
}
return res
}
func countBits(n int) []int {
mapbinary:=make(map[int]string)
mapbinary[0] = "0"
mapbinary[1] = "1"
mapbinary[2] = "10"
res :=[]int{0}
if n<1{
return res
}
for i:=1;i<=n;i++{
mapbinary[i] = addBinary(mapbinary[i-1],mapbinary[1])
res = append(res,getOneNum(mapbinary[i]))
}
return res
}
简单方法,按照比特位的性质设计
func countBits(n int) []int {
bits := make([]int, n+1)
highBit := 0
for i := 1; i <= n; i++ {
if i&(i-1) == 0 {
highBit = i
}
bits[i] = bits[i-highBit] + 1
}
return bits
}