1. 程式人生 > 其它 >338. 位元位計數

338. 位元位計數

描述

給你一個整數n,對於0 <= i <= n中的每個i,計算其二進位制表示中1的個數,返回一個長度為n + 1的陣列ans作為答案。

連結

338. 位元位計數 - 力扣(LeetCode) (leetcode-cn.com)

解法:位運算 判斷 奇偶數, + 動態規劃

對於所有的數字,只有兩類:

奇數:二進位制表示中,奇數一定比前面的那個偶數多一個 1,因為多的就是 最低位(二進位制下)的1.

舉例:
0 = 0 1 = 1
2 = 10 3 = 11

偶數:二進位制表示中,偶數中 1 的個數一定和除以 2 之後的那個數一樣多。因為最低位是 0,除以 2 就是右移一位,也就是把那個 0 抹掉而已,所以 1 的個數是不變的。

舉例:
2 = 10 4 = 100 8 = 1000
3 = 11 6 = 110 12 = 1100
 1 class Solution {
 2     public int[] countBits(int n) {
 3         int[] res = new int[n+1];
 4         res[0] = 0;
 5         for(int i = 1; i<= n; i++) {
 6             if( (i & 1) == 1) {  // 奇數
 7                 res[i] = res[i-1] + 1;
8 } 9 else { // 偶數 10 res[i] = res[i/2]; 11 } 12 } 13 return res; 14 } 15 }

參考

清晰的思路 - 位元位計數 - 力扣(LeetCode) (leetcode-cn.com)