ビット数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 ++や他の言語を使用していません。

アイデア解析

最初はビット演算、カウント数として動作の数と各によって解決++、また時間が長すぎることを知っていると思います。

第二の思想は、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;
    }
公開された117元の記事 ウォンの賞賛8 ビュー3688

おすすめ

転載: blog.csdn.net/qq_34761012/article/details/104608372