LeetCode 计算二进制数中1的个数

Larry · · 826 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

LeetCode 计算二进制数中1的个数

1 题目描述
给定一个非负整数num,对0 ≤ i ≤ num区间内每个整数,计算其对应的二进制数中1的个数,结果用数组返回。

例子1:
输入:2
输出:[0, 1, 1]

例子2:
输入:5
输出:[0,1,1,2,1,2]

题目出处:
https://leetcode.com/problems/counting-bits/

2 解决思路
2.1 常规算法

  1. func decimal2Binary(n int) string {  
  2.     b := ""  
  3.     for {  
  4.         // remain  
  5.         r := 0  
  6.         n, r = n>>1, n%2  
  7.         b = strconv.Itoa(r) + b  
  8.         if 0 == n {  
  9.             return b  
  10.         }  
  11.     }  
  12. }  
  13.   
  14. func countOne(s string) int {  
  15.     c := 0  
  16.     for _, i := range []rune(s) {  
  17.         if '1' == i {  
  18.             c++  
  19.         }  
  20.     }  
  21.     return c  
  22. }  
  23.   
  24. func countBits(num int) []int {  
  25.     s := make([]int, num+1)  
  26.     for i := 0; i <= num; i++ {  
  27.         s[i] = countOne(decimal2Binary(i))  
  28.     }  
  29.     return s  
  30. }  

2.2 改进思路
避免对递增数组中的每个数值作计算,将4位看做一个单元,单元内0-15的二进制数中1的个数是确定的。这样采用16进制去计算,给定数值,每除以16所得的余数就是落在该单元内的数值,直至被除数为0,将每个单元中1的个数累加既可。

3 golang实现代码
https://github.com/olzhy/leetcode/blob/master/338_Couting_Bits/test.go

  1. func countBinaryOneInHexUnit(n intint {  
  2.     countOne := 0  
  3.     switch n {  
  4.     case 0:  
  5.         countOne = 0  
  6.     case 1248:  
  7.         countOne = 1  
  8.     case 35691012:  
  9.         countOne = 2  
  10.     case 7111314:  
  11.         countOne = 3  
  12.     case 15:  
  13.         countOne = 4  
  14.     }  
  15.     return countOne  
  16. }  
  17.   
  18. func countBinaryOne(n intint {  
  19.     // remain  
  20.     r := 0  
  21.     countOne := 0  
  22.     for n > 0 {  
  23.         n, r = n>>4, n%16  
  24.         countOne += countBinaryOneInHexUnit(r)  
  25.     }  
  26.     return countOne  
  27. }  
  28.   
  29. func countBits(num int) []int {  
  30.     s := make([]int, num+1)  
  31.     for i := 0; i <= num; i++ {  
  32.         s[i] = countBinaryOne(i)  
  33.     }  
  34.     return s  
  35. }  

4 基准测试
4.1 测试代码

  1. package main  
  2.   
  3. import (  
  4.     "testing"  
  5. )  
  6.   
  7. func BenchmarkCountBits(b *testing.B) {  
  8.     for i := 0; i < b.N; i++ {  
  9.         countBits(100000000)  
  10.     }  
  11. }  
  1. go test -test.bench=".*"  

4.2 测试结果

  1. goos: darwin  
  2. goarch: amd64  
  3. pkg: github.com/olzhy/test  
  4. BenchmarkCountBits-4           1        4618146566 ns/op  
  5. PASS  
  6. ok      github.com/olzhy/test   4.670s  
   ,

有疑问加站长微信联系(非本文作者)

本文来自:磊磊落落的博客

感谢作者:Larry

查看原文:LeetCode 计算二进制数中1的个数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

826 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传