题目链接:https://leetcode.com/problems/counting-bits/description/

题目大意:求解从0到num的所有数的二进制表示中所有1的个数。

法一:暴力解,两个for循环,分别求解每一个二进制表示,然后计数其中1的个数。代码如下(耗时9ms):

     public int[] countBits(int num) {
int[] res = new int[num+1];
for(int i = 0; i <= num; i++) {
res[i] = bit(i);
}
return res;
}
public static int bit(int num) {//转换为二进制计数1的个数
int cnt = 0;
while(num != 0) {
cnt += num % 2;
num /= 2;
}
return cnt;
}

法二:在法一的基础上,优化了内层循环,利用记忆搜索的思想,因为已经用res数组存下了i之前数据的1的个数,而当i/2之后得到的数据,一定是之前已经计算过的数据,这样就可以直接拿过来用,而不用再次计算。比如要计算5时,只需要算出5%2得到的数值,然后就要对5进行/2运算了,而5/2=2,在前面已经存储过res[2]的数值了,所以就得到res[5]=5%2+res[5/2]。代码如下(耗时3ms):

     public int[] countBits(int num) {
int[] res = new int[num+1];
res[0] = 0;
for(int i = 1; i <= num; i++) {
int tmp = i;
res[i] = (tmp % 2) + res[tmp / 2];
}
return res;
}

法三:在法二的基础上,用位运算的办法来做取余和除2运算。的确快了点。代码如下(耗时2ms):

     public int[] countBits(int num) {
int[] res = new int[num + 1];
res[0] = 0;
for(int i = 1; i <= num; i++) {
res[i] = (i & 1) + res[i >> 1];
}
return res;
}

338.Counting Bits---位运算---《剑指offer》32的更多相关文章

  1. 剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出

    剑指 Offer 32 - III. 从上到下打印二叉树 III Offer_32_3 题目详情 题解分析 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Coll ...

  2. 剑指 Offer 32 - II. 从上到下打印二叉树 II + 层次遍历二叉树 + 按层存储

    剑指 Offer 32 - II. 从上到下打印二叉树 II Offer_32 题目描述: 题解分析: 这道题我一开始想到的解决方法较粗暴,就是使用两个变量来记录当前层的节点数和下一层的结点数. 以上 ...

  3. 剑指 Offer 32 - I. 从上到下打印二叉树 + 层次遍历二叉树

    剑指 Offer 32 - I. 从上到下打印二叉树 Offer_32_1 题目描述 解题思路 这题属于简单题,考察的是我们对二叉树以及层次遍历的方法. 这里只需要使用简单的队列即可完成二叉树的层次遍 ...

  4. 剑指 Offer 32 - II. 从上到下打印二叉树 II

    剑指 Offer 32 - II. 从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,1 ...

  5. 剑指 Offer 32 - III. 从上到下打印二叉树 III

    剑指 Offer 32 - III. 从上到下打印二叉树 III 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, ...

  6. 剑指 Offer 32 - I. 从上到下打印二叉树

    剑指 Offer 32 - I. 从上到下打印二叉树 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 ...

  7. 【Warrior刷题笔记】剑指offer 32. 三道题,让你学会二叉树的深度广度优先遍历与递归迭代技术

    题目一 剑指 Offer 32 - I. 从上到下打印二叉树 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-shang-dao-xi ...

  8. 【Java】 剑指offer(32) 从上往下打印二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 (一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺 ...

  9. 剑指Offer 32. 把数组排成最小的数 (数组)

    题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题目地址 h ...

  10. 剑指offer——32从上到下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印.   题解: 就是简单的层序遍历 class Solution { public: vector<int> PrintFro ...

随机推荐

  1. IDEA使用switch传入String编译不通过

    今天在使用IDEA的时候,用到switch分支语句,传入String参数的时候一直报错,下面是源码报错截图: 看错误提示并没有提到switch支持String类型,不过ava1.7之后就支持Strin ...

  2. 吉哥系列故事――完美队形II HDU - 4513(马拉车变一下形)

    题意: 求最长回文串...但这个回文串要符合从中间到两头 逐个递减 解析: 在扩散的时候加一个判断就好了 #include <iostream> #include <cstdio&g ...

  3. Python下json中文乱码解决办法

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,只需要 #coding=utf8 import json js = json.loads('{" ...

  4. VSS2005设置不输入密码直接登录VSS

    1.登录管理员 2.Tools-->Options-->General -->Use network name for automatic user log in  去掉勾选不自动登 ...

  5. XML 增加属性

    var resultDoc = new XmlDocument(); resultDoc.LoadXml("<root></root>"); resultD ...

  6. 用户缓冲式I/O

    2018-08-05 (星期日)缓冲式I/O    所有磁盘操作都是按照块来进行的,因此,若所送出的I/O请求,其对齐块便捷为实际块大小的整数倍,则可以优化I/O的性能.    读取操作需要进行的系统 ...

  7. 【转载】 HDU 动态规划46题【只提供思路与状态转移方程】

    1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包;第一次做的时候把概率当做背包(放大100000倍化为整数) ...

  8. Lipshitz

    Portal --> broken qwq Description 大M正在学习函数的光滑性并对Lipschitz常数非常感兴趣:当一个定义域为\([l,r]\)的函数\(f\),对于定义域内的 ...

  9. vmware中ubuntu虚拟机扩容

    https://blog.csdn.net/ldzm_edu/article/details/78893721

  10. GitLab安装部署与管理

    一.安装Gitlab前系统预配置准备工作 操作系统:centos 7.3 1.关闭firewalld防火墙 #systemctl stop firewalld //关闭防火墙 #systemctl d ...