leetcode 191
題目背景:
大體意思就是一個int數(shù)字轉(zhuǎn)成2進(jìn)制后有多少個1沈善。
思路一:
直接轉(zhuǎn)成2進(jìn)制數(shù)組别渔,sum(int[])來獲取所有的1浑度;
思路二:
我聯(lián)想到10進(jìn)制轉(zhuǎn)2進(jìn)制雪位,所有的1都出現(xiàn)在余數(shù)reminder中鉴象,所以只要有余數(shù)就在result中+1
代碼如下:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int res = 0;
while(n != 0){
if((n & 1) == 1){
res++;
}
n = n >>> 1;
}
return res;
}
}
n&1 == 1
判斷當(dāng)前n是否是奇數(shù)滞欠,是奇數(shù)古胆,則res++
。submit的時候一直報錯筛璧,timing out
后面感覺應(yīng)該是>>
與>>>
的區(qū)別逸绎。本題應(yīng)該采用>>>
,因為如果采用>>
是有符號右移操作夭谤,負(fù)數(shù)會導(dǎo)致n一直非0棺牧,進(jìn)入死循環(huán)。
思路三
利用一個mask
來與n
進(jìn)行&運(yùn)算朗儒,最后通過mask的迭代左移進(jìn)行計數(shù)颊乘。
代碼如下:
int mask = 1;
int count = 0;
for(int i=0; i < 32; i++){
if((n & mask) != 0) ++count;
mask = mask << 1;
}
return count;