191. 位 1 的个数 ●
191. 位 1 的個(gè)數(shù) ●
描述
編寫一個(gè)函數(shù),輸入是一個(gè)無符號(hào)整數(shù)(以二進(jìn)制串的形式),返回其二進(jìn)制表達(dá)式中數(shù)字位數(shù)為 ‘1’ 的個(gè)數(shù)(也被稱為漢明重量)。
示例
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進(jìn)制串 00000000000000000000000000001011 中,共有三位為 ‘1’。
題解
1. 循環(huán)檢查二進(jìn)制位
直接循環(huán)檢查給定整數(shù) n 的二進(jìn)制位的每一位是否為 1。
具體的,從二進(jìn)制數(shù)低位到高位進(jìn)行檢查,每次移動(dòng) i ? 1 i- 1 i?1 位,并與 1 1 1 做 & 與運(yùn)算,來檢查第 i i i 低位的數(shù),
- 時(shí)間復(fù)雜度: O ( k ) O(k) O(k),其中 k 是 int 型的二進(jìn)制位數(shù), k = 32 k=32 k=32。我們需要檢查 n 的二進(jìn)制位的每一位,一共需要檢查 32 位。
- 空間復(fù)雜度: O ( 1 ) O(1) O(1),我們只需要常數(shù)的空間保存若干變量。
2. 位運(yùn)算優(yōu)化
觀察這個(gè)運(yùn)算: n & ( n ? 1 ) n~\&~(n - 1) n?&?(n?1),其運(yùn)算結(jié)果恰為把 n 的二進(jìn)制位中的最低位的 1 變?yōu)?0 之后的結(jié)果。
如: 6 & ( 6 ? 1 ) = 4 , 6 = ( 110 ) 2 , 4 = ( 100 ) 2 6~\&~(6-1) = 4, 6 = (110)_2, 4 = (100)_2 6?&?(6?1)=4,6=(110)2?,4=(100)2?,運(yùn)算結(jié)果 4 即為把 6 的二進(jìn)制位中的最低位的 1 變?yōu)?0 之后的結(jié)果。
這樣我們可以利用這個(gè)位運(yùn)算的性質(zhì)加速我們的檢查過程,在實(shí)際代碼中,我們不斷讓當(dāng)前的 n 與 n?1 做與運(yùn)算,直到 n 變?yōu)?0 即可。因?yàn)槊看芜\(yùn)算會(huì)使得 n 的最低位的 1 被翻轉(zhuǎn),因此運(yùn)算次數(shù)就等于 n 的二進(jìn)制位中 1 的個(gè)數(shù)。
- 時(shí)間復(fù)雜度: O ( log ? n ) O(\log n) O(logn)。循環(huán)次數(shù)等于 n 的二進(jìn)制位中 1 的個(gè)數(shù),最壞情況下 n 的二進(jìn)制位全部為 1。
- 空間復(fù)雜度: O ( 1 ) O(1) O(1),我們只需要常數(shù)的空間保存若干變量。
總結(jié)
以上是生活随笔為你收集整理的191. 位 1 的个数 ●的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CDO基础操作(一):用CDO进行数据查
- 下一篇: 智慧垃圾焚烧发电厂Web3D可视化管理系