博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
338. Counting Bits
阅读量:5050 次
发布时间:2019-06-12

本文共 1439 字,大约阅读时间需要 4 分钟。

最开始一下子想不出来好的方法用的是O(n*sizeof(integer))的方法,辗转相除,每次除以2以后的余数就是bitwise上的数字。

1     public int[] countBits(int num) { 2         int[] res = new int[num + 1]; 3         res[0] = 0; 4         for(int i = 1; i <= num; i++) { 5             int x = i; 6             int cnt = 0; 7             while(x != 0) { 8                 if(x % 2 == 1){ 9                     cnt++;10                 } 11                 x /= 2;12             }13             res[i] = cnt;14         }15         return res;16     }

然后我自己想了下O(n)的方法

总体的想法是一组一组,每组的size是小于该数最大的2^n的值。

即res[4]=res[0]+1, res[5] = res[1] + 1, res[6] = res[2] + 1

1     public int[] countBits(int num) { 2         int[] res = new int[num + 1]; 3         if(num == 0) { 4             res[0] = 0; 5             return res; 6         } 7         res[0] = 0; 8         res[1] = 1; 9         int cnt = 1;10         for(int i = 2; i <= num; i++) {11             int cur = (int)Math.pow(2, cnt);12             int next = cur * 2;13             while(i <= num && i < next) {14                 res[i] = res[i - cur] + 1;15                 i++;16             }17             i--;18             cnt++;19         }20         return res;21     }

然后别人的做法就跟好看啦,

1     public int[] countBits(int num) {2         int[] res = new int[num + 1];3         for(int i = 1; i <= num; i++) {4             res[i] = res[i >> 1] + (i & 1);5         }6         return res;7     }

 

转载于:https://www.cnblogs.com/warmland/p/5720093.html

你可能感兴趣的文章
javaweb常识
查看>>
Java注解
查看>>
web自己主动保存表单
查看>>
一个小的日常实践——高速Fibonacci数算法
查看>>
机器学些技法(9)--Decision Tree
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
Qt中子窗口全屏显示与退出全屏
查看>>
使用brew安装软件
查看>>
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>
吴裕雄 python 机器学习——数据预处理嵌入式特征选择
查看>>
Centos6.4安装JDK
查看>>
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
Kubernetes 运维学习笔记
查看>>
并查集 经典 畅通工程
查看>>
Spark MLlib 之 Naive Bayes
查看>>