笔试题3. LeetCode OJ (3) Counting Bits
来源:互联网 发布:c语言调用函数什么意思 编辑:程序博客网 时间:2024/06/01 18:21
题目的意思是:给定一个非负整数i,在范围0≤i≤num数中计算二进制表示的1的数量,并把他们作为一个数组返回。
class Solution {public: vector<int> countBits(int num) { vector<int> ret(num+1,0); int cnt=0; int j=1; int temp; ret[0]=0; for(int i=1;i<=num;++i){ cnt=0; temp=i; while(temp>0){ if(temp%2==1) cnt++; temp=temp>>1; } ret[j]=cnt; ++j; } return ret; }};
总算自己码出了代码,虽然和各位大神的代码还有点距离,但是自己还是很开心,继续加油!说下我的思路,我是直接按照题目的要求,算每一个数的二进制表示中的1的数量。
关键语句:
while(temp>0) { if(temp%2==1) cnt++; temp=temp>>1; }
“temp%2==1”就是求二进制表示数的最后一位,如果等于1,cnt++。然后“temp=temp>>1;”表示让这个二进制数右移一位,最高位用0补齐,直到temp=0,这样就求得了一个数二进制表示中1的数量。
下面看看大神们的代码:
主要是观察到
1
10
11
100
101
110
111
1000
上述观察到1->10/11 10->100/101 11->110/111
即循环地在每个数后面加0、1可得接下来的数字。因此第i位就是第i/2位+(i%2)的值。以下为我的代码:
class Solution { public: vector<int> countBits(int num) { vector<int>vec(num+1,0); vec[0]=0; for(int i = 1; i <= num; i++){ vec[i]=vec[i/2]+(i % 2); } return vec; } };
思路一样,就是算的过程不一样的代码:
class Solution { public: vector<int> countBits(int num) { vector<int> ret(num+1, 0); for (int i = 1; i <= num; ++i) ret[i] = ret[i&(i-1)] + 1; return ret; } };
0 0
- 笔试题3. LeetCode OJ (3) Counting Bits
- <LeetCode OJ> 338. Counting Bits
- leetcode oj java Counting Bits
- LeetCode OJ-338.Counting Bits
- LeetCode oj 338. Counting Bits(DP)
- leetcode第一题~~~Counting Bits
- OJ -338 Counting bits
- leetcode:bits:Counting Bits(338)
- LeetCode 第 338 题 (Counting Bits)
- leetcode算法题总结之Counting Bits
- 【leetcode】经典算法题-Counting Bits
- [leetcode] 338. Counting Bits
- 【LeetCode-338】Counting Bits
- leetcode-338-Counting Bits
- leetcode:Counting Bits
- [C]LeetCode:Counting Bits
- LeetCode Counting Bits
- leetcode 338. Counting Bits
- 12.1 Spring整合Hibernate
- VC6/VS2003编译器优化造成的bug
- Java高并发编程——为IO密集型应用设计线程数与划分任务
- Android drawable微技巧,你所不知道的drawable的那些细节
- HDU-1003 Max sum
- 笔试题3. LeetCode OJ (3) Counting Bits
- AFNetworking到底做了什么?
- 值得推荐的C/C++框架和库(深度好文)
- php输出
- TCL在Linux下如何执行
- POJ 3259 Wormholes (Bellman Ford判负环)
- MFC程序崩溃问题汇总
- shell HelloWorld+字符串+变量
- Ubuntu下deb包的安装方法