Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

readme.md

338. Counting Bits

Easy

Given an integer n, return an array ans of length n + 1 such that for each i (0 <= i <= n), ans[i] is the number of 1's in the binary representation of i.

Example 1:

Input: n = 2

Output: [0,1,1]

Explanation:

0 --> 0
1 --> 1
2 --> 10 

Example 2:

Input: n = 5

Output: [0,1,1,2,1,2]

Explanation:

0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101 

Constraints:

  • 0 <= n <= 105

Follow up:

  • It is very easy to come up with a solution with a runtime of O(n log n). Can you do it in linear time O(n) and possibly in a single pass?
  • Can you do it without using any built-in function (i.e., like __builtin_popcount in C++)?

Solution

# @param {Integer} num
# @return {Integer[]}
def count_bits(num)
  result = Array.new(num + 1, 0)
  border_pos = 1
  incr_pos = 1

  (1..num).each do |i|
    # when we reach pow of 2, reset border_pos and incr_pos
    if incr_pos == border_pos
      result[i] = 1
      incr_pos = 1
      border_pos = i
    else
      result[i] = 1 + result[incr_pos]
      incr_pos += 1
    end
  end

  result
end