338ビットカウント
非負整数NUMを考えます。0≤I≤I、二進数字1と配列として返すそれらの数を算出し、各デジタルNUM範囲のため。
例1:
入力:2
出力:[0,1,1]
例2:
入力:5
出力:[0,1,1,2,1,2]
アドバンス:
時間の複雑さを考えるとO(N *はsizeof(整数)がされて ) 非常に簡単に答えます。しかし、あなたは1が通過して線形時間O(n)の中でそれを行うことができますか?
アルゴリズムの複雑さの空間要件はO(N)です。
あなたは、さらにソリューション、それを改善することができますか?要求は、これを実行するために、任意の組み込み関数(例えば、中__builtin_popcount C ++)でのC ++や他の言語を使用していません。
PS:
I& - ( - 1 I)Iよりも小さく、I&(I - 1)の数を有する(I 1)は、iが1(もしあれば)、そのためI&右端除去することができます数1プラス1 -数iがI&(1 I)の一つであるので前に、カウント
class Solution {
public int[] countBits(int num) {
int[] res = new int[num + 1];
for(int i = 1;i<= num;i++){ //注意要从1开始,0不满足
res[i] = res[i & (i - 1)] + 1;
}
return res;
}
}