タイトル説明
非負整数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 ++や他の言語を使用していません。
アイデア解析
最初はビット演算、カウント数として動作の数と各によって解決++、また時間が長すぎることを知っていると思います。
第二の思想は、0 1,1位置0、および0〜1の右端の位置に直接添加され、最下位ビットが0または1であると判断し、0 ...中間セットの半分に書き込まれ、上記と同様の複雑さを知ること
最後に、奇数偶数に対応し、見つかった法律を見つける前+1,1 +1に直接もあります。でも、最下位ビットが0、0であるため、正しいものはそのまま2,1に数相当で割っ消去する場合。
コードの実装
public int[] countBits(int num) {
int[] ret = new int[num + 1];
int count = 0;
for (int i = 0; i <= num; i++) {
if (i % 2 == 1) {
ret[i] = ret[i - 1] + 1;
} else {
ret[i] = ret[i / 2];
}
}
return ret;
}