338CountingBits
2016-05-20 08:36
183 查看
从1开始,【0】、【1】、【1、2】、【1、2、 2、3】...【2^root, .. 2^root+2^(root-1),.. ,.2^(root+1)】
其中【2^root, .. 2^root+2^(root-1)】重复前面一个区间的序列,【2^root+2^(root-1),.. ,.2^(root+1)】是前面的序列的对应的每个值加1;
余下不足的一个完整区间长度的部分,分为前半部分和后半部分考虑。
其中【2^root, .. 2^root+2^(root-1)】重复前面一个区间的序列,【2^root+2^(root-1),.. ,.2^(root+1)】是前面的序列的对应的每个值加1;
余下不足的一个完整区间长度的部分,分为前半部分和后半部分考虑。
public class Solution { public int[] countBits(int num) { if(num < 0) return null; switch(num){ case 0: return new int[]{0}; case 1: return new int[]{0, 1}; case 2: return new int[]{0, 1, 1}; case 3: return new int[]{0, 1, 1, 2}; //数组赋值与初始化方法 default : int res[] = new int[num+1]; //0~num 总共num+1个元素 res[0] = 0; res[1] = 1; res[2] = 1; res[3] = 2; int i, cur = 3, count; int root = (int)Math.floor(Math.log(num+1)/Math.log(2)); // 2^root <= num < 2^(root+1) while(cur <= root){ //one range count = (int)Math.pow(2, cur-1); //eles in the range for(i = count; i < count + count/2; i++){ res[i] = res[i- count/2]; res[i+count/2] = res[i] + 1; } cur++; } cur = (int)Math.pow(2, root); count = num - cur + 1; if(count <= cur/2){ for(i = cur; count > 0; i++, count--){ res[i] = res[i - cur/2]; } } else{ //System.out.println(" " + root); int rem = cur; for(i = rem, cur = 0 ; cur < rem/2; i++, cur++){ res[i] = res[i - rem/2]; } // System.out.println(i +" " + cur); while(count - cur > 0){ res[i] = res[i - rem/2] + 1; i++; count--; } } return res; } } }
相关文章推荐
- 如何写好一份竞品运营分析报告?
- 骆驼拼写法(CamelCase)
- Qt所有类型转换
- ny 万圣节派对
- Android App图标尺寸
- 谈谈网站防盗链
- 基于DDD的.NET开发框架 - ABP模块设计
- 《Linux驱动》iTop4412开发板LCD驱动 详细分析 (一)
- iOS中__block 关键字的底层实现原理
- JAVA 随机数和数学运算
- Ehcache配置详解及CacheManager使用
- 註冊監聽器的兩種方法
- MVVM奇葩说
- eclipse 代码中突然出现特殊字符
- Java内存溢出解决办法
- java字节码入门(上)
- div#div2
- ACM probloms->1003
- sublime text 快捷键
- Linux 中如何使用 gThumb 批量调整图片大小