類型:位運(yùn)算
- 題目:編寫(xiě)一個(gè)函數(shù)货抄,輸入是一個(gè)無(wú)符號(hào)整數(shù)(以二進(jìn)制串的形式),返回其二進(jìn)制表達(dá)式中數(shù)字位數(shù)為 '1' 的個(gè)數(shù)(也被稱為[漢明重量])。
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進(jìn)制串 00000000000000000000000000001011 中,共有三位為 '1'浮庐。
示例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進(jìn)制串 00000000000000000000000010000000 中,共有一位為 '1'柬焕。
示例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進(jìn)制串 11111111111111111111111111111101 中审残,共有 31 位為 '1'。
提示:
輸入必須是長(zhǎng)度為 32 的 二進(jìn)制串 斑举。
-
位運(yùn)算法
- 由位運(yùn)算可知搅轿,將二進(jìn)制數(shù)最右邊的 1 設(shè)為 0,y = x & (x-1)富玷;
- 然后不斷計(jì)數(shù)璧坟,可以得出二進(jìn)制串中1的個(gè)數(shù);
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
while(n != 0){
//將最右邊的1設(shè)為0
n = n & (n - 1);
count++;
}
return count; //返回計(jì)數(shù)結(jié)果
}
}
小知識(shí):
高頻面試題:老鼠試毒
??有 8 個(gè)一模一樣的瓶子凌彬,其中有 7 瓶是普通的水沸柔,有一瓶是毒藥循衰。任何喝下毒藥的生物都會(huì)在一星期之后死亡〔玻現(xiàn)在,你只有 3 只小白鼠和一星期的時(shí)間会钝,如何檢驗(yàn)出哪個(gè)瓶子里有毒藥伐蒋?
解題步驟如下:
1、 把這 8 個(gè)瓶子從 0 到 7 進(jìn)行編號(hào)迁酸,用二進(jìn)制表示如下
000
001
010
011
100
101
110
111
2先鱼、 將 0 到 7 編號(hào)中第一位為 1 的所有瓶子(即 1,3奸鬓,5焙畔,7)的水混在一起給老鼠 1 吃,第二位值為 1 的所有瓶子(即2串远,3宏多,6,7)的水混在一起給老鼠 2 吃澡罚, 第三位值為 1 的所有瓶子(4伸但,5,6留搔,7)的水混在一起給老鼠 3 吃更胖,現(xiàn)在假設(shè)老鼠 1,3 死了,那么有毒的瓶子編號(hào)中第 1却妨,3 位肯定為 1饵逐,老鼠 2 沒(méi)死,則有毒的瓶子編號(hào)中第 2 位肯定為 0彪标,得到值 101 梳毙,對(duì)應(yīng)的編號(hào)是 5, 也就是第五瓶的水有毒捐下。
??這道題及其相關(guān)的變種在面試中出現(xiàn)地比較頻繁账锹,比如我現(xiàn)在把 8 瓶水換成 1000 瓶,問(wèn)你至少需要幾只老鼠才能測(cè)出有毒的瓶子坷襟,有了上述的思路相信應(yīng)該不難奸柬,幾只老鼠就相當(dāng)于幾個(gè)進(jìn)制位,顯然 2^10 = 1024 > 1000婴程,即 10 只老鼠即可測(cè)出來(lái)廓奕。