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.
給予一個整數 n,回傳一個陣列 ans 的長度為 n + 1, 讓每個 i (0 <= i <= n),ans[i] 是 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
Solution:
1. 建立 ans 陣列為 [0]。
2. 執行 i = n 的迴圈,
每一輪 ans 的陣列 i 位置皆為 ans[Math.floor(i / 2)] + i % 2 的和。
------------- 0000 8421 ------------- 0 0000 0 ------------- 1 0001 1 ------------- 2 0010 1 3 0011 2 ------------- 4 0100 1 5 0101 2 6 0110 2 7 0111 3 ------------- 8 1000 1 9 1001 2 10 1010 2 11 1011 3 12 1100 2 13 1101 3 14 1110 3 15 1111 4
3. 回傳 ans。
Code 1:
var countBits = function(n) { if(n === 0) return [0]; let ans = [0] for (let i = 0; i <= n; i++) { ans[i] = ans[Math.floor(i / 2)] + i % 2 } return ans };
FlowChart:
Example 1
Input: n = 2 ans[0] = ans[Math.floor(0 / 2)] + 0 % 2 => [ 0 ] ans[1] = ans[Math.floor(1 / 2)] + 1 % 2 => [ 0, 1 ] ans[2] = ans[Math.floor(2 / 2)] + 2 % 2 => [ 0, 1, 1 ] return ans = [ 0, 1, 1 ]
Example 2
Input: n = 5 ans[0] = ans[Math.floor(0 / 2)] + 0 % 2 => [ 0] ans[1] = ans[Math.floor(0 / 2)] + 0 % 2 => [ 0, 1 ] ans[2] = ans[Math.floor(1 / 2)] + 0 % 2 => [ 0, 1, 1 ] ans[3] = ans[Math.floor(2 / 2)] + 0 % 2 => [ 0, 1, 1, 2 ] ans[4] = ans[Math.floor(3 / 2)] + 0 % 2 => [ 0, 1, 1, 2, 1 ] ans[5] = ans[Math.floor(4 / 2)] + 0 % 2 => [ 0, 1, 1, 2, 1, 2 ] return ans = [ 0, 1, 1, 2, 1, 2 ]