338.Counting Bits---位运算---《剑指offer》32
题目链接: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的更多相关文章
- 剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出
剑指 Offer 32 - III. 从上到下打印二叉树 III Offer_32_3 题目详情 题解分析 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Coll ...
- 剑指 Offer 32 - II. 从上到下打印二叉树 II + 层次遍历二叉树 + 按层存储
剑指 Offer 32 - II. 从上到下打印二叉树 II Offer_32 题目描述: 题解分析: 这道题我一开始想到的解决方法较粗暴,就是使用两个变量来记录当前层的节点数和下一层的结点数. 以上 ...
- 剑指 Offer 32 - I. 从上到下打印二叉树 + 层次遍历二叉树
剑指 Offer 32 - I. 从上到下打印二叉树 Offer_32_1 题目描述 解题思路 这题属于简单题,考察的是我们对二叉树以及层次遍历的方法. 这里只需要使用简单的队列即可完成二叉树的层次遍 ...
- 剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - II. 从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,1 ...
- 剑指 Offer 32 - III. 从上到下打印二叉树 III
剑指 Offer 32 - III. 从上到下打印二叉树 III 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, ...
- 剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - I. 从上到下打印二叉树 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 ...
- 【Warrior刷题笔记】剑指offer 32. 三道题,让你学会二叉树的深度广度优先遍历与递归迭代技术
题目一 剑指 Offer 32 - I. 从上到下打印二叉树 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-shang-dao-xi ...
- 【Java】 剑指offer(32) 从上往下打印二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 (一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺 ...
- 剑指Offer 32. 把数组排成最小的数 (数组)
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题目地址 h ...
- 剑指offer——32从上到下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题解: 就是简单的层序遍历 class Solution { public: vector<int> PrintFro ...
随机推荐
- 51nod-1220-约数之和
题意 求 \[ \sum _{i=1}^n\sum _{j=1}^nd(ij) \\ d(x)=\sum _{e|x}e \] \(n\le 10^9\) . 分析 没有推出来.这题有几个要点要学习. ...
- 【HLSDK系列】怎么增加一种新实体
你平常肯定接触到很多比如 info_player_start hostage info_target 之类的实体,这里就解释一下怎么创建一种新的实体. 首先建立一个新的 .h 文件(当然你写在现有的文 ...
- redis安全性 添加访问密码
设置客户端连接访问redis服务器必须进行身份验证. vi打开编辑redis配置文件:[root@martin etc]# vi /usr/local/redis/etc/redis.conf 在约1 ...
- 第一个python教程(1)
使用文本编辑器 在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为 ...
- 「CodePlus 2017 12 月赛」可做题2(矩阵快速幂+exgcd+二分)
昨天这题死活调不出来结果是一个地方没取模,凉凉. 首先有个一眼就能看出来的规律... 斐波那契数列满足$a_1, a_2, a_1+a_2, a_1+2a_2, 2a_1+3a_2, 3a_1+5a_ ...
- 《剑指offer》— JavaScript(10)矩形覆盖
矩形覆盖 题目描述 我们可以用(2*1)的小矩形横着或者竖着去覆盖更大的矩形.请问用n个(2*1)的小矩形无重叠地覆盖一个(2*n)的大矩形,总共有多少种方法? 实现代码 function jumpF ...
- Qt ------ 控件布局 setSizePolicy
setSizePolicy 是设置控件在布局(layout)里面的大小变化的属性.如果控件没有在布局里,没什么用. 默认情况下,把 widget 放入 layout,widget 的大小一定程度上会随 ...
- 「Python」19个python编写技巧
1. 交换赋值 2. Unpacking 3. 使用操作符in 4. 字符串操作 5. 字典键值列表 6. 字典键值判断 7. 字典 get 和 setdefault 方法 8. 判断真伪 9. 遍历 ...
- webpack中Module build failed: Unknown word (2:1)
在新建的webpack.config.js文件中配置好style-loader和css-loader,注意顺序为:style-loader,css-loader,less-loader,postcss ...
- (转) 使用vivado创建工程 2
Build the hardware platform and export to SDK A basic ARM hardware platform is now configured. The c ...