給定乙個非負整數 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的個數。由於要...