位元位計數

2021-10-25 17:12:03 字數 1196 閱讀 2972

給定乙個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。

示例 1:

輸入: 2

輸出: [0,1,1]

示例 2:

輸入: 5

輸出: [0,1,1,2,1,2]

1.暴力法

intisbinary

(int n)

}return count;

}int

*countbits

(int num,

int* returnsize)

return returnarray;

}

2 最高有效位--

--動態規劃

當計算i的「一位元數」時,如果存在 0≤j令bits[i] 表示i的「一位元數」,則上述關係可以表示成:bits[i]

=bits[j]+1。

對於正整數x,如果可以知道最大的正整數y,使得y≤x 且y是2的整數次冪,則y的二進位制表示中只有最高位是1,其餘都是0,此時稱y為x的「最高有效位」。令z=x−y,顯然0≤z=bits[z]+1。

為了判斷乙個正整數是不是2的整數次冪,可以利用按位「與」運算的性質。如果正整數y是2的整數次冪,則y的二進位制表示中只有最高位是1,其餘都是0,因此y&

(y−1)=

0。由此可見,正整數y 是2的整數次冪,當且僅當y&

(y−1)=

0。顯然,0的「一位元數」為0。使用highbit表示當前的最高有效位,遍歷從1到num 的每個正整數i,進行如下操作:

如果i&

(i−1)=

0,則令highbit=i,更新當前的最高有效位。

i比i−highbit 的「一位元數」多1,由於是從小到大遍歷每個數,因此遍歷到i時, i−highbit 的「一位元數」已知,令bits[i]

=bits[i−highbit]+1。

#include

intmain()

bits[i]

=bits[i-high]+1

;}for(

int i=

0;i<=num;i++

)printf

("%d "

,bits[i]);

return0;

}

位元位計數

一 題目描述 二 題目分析 題解參考 自己分析沒分析出來,看完題解,忍不住妙出了聲。對於數字有兩類,偶數與奇數,從二進位制的角度看,奇數的二進位制標示肯定比前面乙個偶數多1,因為偶數的最低為0,而因為最低為為0,則讓乙個偶數的二進位制1的個數一定和自身除以2後的二進位制1的個數相等。通過上面這兩個特...

位元位計數

位元位計數 給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。題解 這種題如果不加限制的話可以選擇移位 1的方式計算1的個數 但是要求是在o n 的時間複雜度下完成就需要腦筋急轉彎啦 0000 0 0001 1 0000 00...

位元位計數

目錄題解 給定乙個非負整數num。對於0 i num範圍中的每個數字i,計算其二進位制數中的1的數目並將它們作為陣列返回。輸出輸入 2輸出 0 1 1輸入 5輸出 0 1 1 2 1 2由於n n 1 可以消去n對應的二進位制數的最後一位1,那麼以此可以求出計算n對應的二進位制數中的1的個數。由於要...