lintcode/leetcode由易至难第17题:Counting Bits
2017-06-26 18:07
281 查看
Problem:
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and
return them as an array.
Example:
For
Follow up:
It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
Space complexity should be O(n).
Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.
Code笨方法:
Code聪明方法,发现i和i/2之间存在规律:
Code聪明方法2,发现i和i-1之间存在规律:
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and
return them as an array.
Example:
For
num = 5you should return
[0,1,1,2,1,2].
Follow up:
It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
Space complexity should be O(n).
Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.
Code笨方法:
public class Solution { public int[] countBits(int num) { int[] nums = new int[num + 1]; for(int i = 0; i <= num; i++){ int k = i; int count = 0; while(k != 0){ if ((k & 1) == 1){ count++; } k = k >> 1; } nums[i] = count; } return nums; } }
Code聪明方法,发现i和i/2之间存在规律:
public class Solution { public int[] countBits(int num) { int[] nums = new int[num + 1]; for(int i = 0; i <= num; i++){ nums[i] = nums[i / 2] + (i % 2); //i/2可以替换成i >> 1;i%2可以替换成i&1 } return nums; } }
Code聪明方法2,发现i和i-1之间存在规律:
public class Solution { public int[] countBits(int num) { int[] nums = new int[num + 1]; nums[0] = 0; for(int i = 1; i <= num; i++){ nums[i] = nums[i & (i - 1)] + 1; } return nums; } }
相关文章推荐
- lintcode/leetcode由易至难第6题:Number Complement
- lintcode/leetcode由易至难第16题:Reshape the Matrix
- lintcode/leetcode由易至难第20题:Integer Break
- lintcode/leetcode由易至难第12题:Majority Element
- lintcode/leetcode由易至难第13题:Max Consecutive Ones
- Climping Stairs lintcode/leetcode
- lintcode/leetcode由易至难第2题:冒泡排序
- lintcode/leetcode由易至难第9题:Nim Game
- lintcode/leetcode由易至难第8题:Reverse String
- lintcode/leetcode由易至难第3题:选择排序
- lintcode/leetcode由易至难第19题:Teemo Attacking
- lintcode/leetcode由易至难第22题:Complex Number Multiplication
- lintcode/leetcode由易至难第5题:Hamming Distance
- lintcode--平面范围求和-不可变矩阵(leetcode--Range Sum Query 2D)
- lintcode/leetcode由易至难第15题:Merge Two Binary Trees
- lintcode/leetcode由易至难第14题:Single Number
- lintcode/leetcode由易至难第4题:Array Partition I
- lintcode/leetcode由易至难第18题:Find Bottom Left Tree Value
- lintcode/leetcode由易至难第10题:Delete Node in a Linked List
- 排颜色问题——数组 leetcode lintcode