這是我在面試時考官問我的一道演算法題,但是當時我沒有好的想法,只是用最基本的方法寫出來的,現在整理一下這道題的思路:
1、不完善版:(問題一:如果把右移換成/2可以嗎:不可以,因為除法的效率比移位運算的效率低; 問題二:如果輸入的負數會出現什麼情況:因為是右移,負數會高位補1,最後陷入死迴圈)
public int method1(int binary)
//count += binary&1;
binary = binary >> 1;
} return count;
}
2、標準版:通過設定標誌位且讓標誌位左移避免陷入死迴圈中。
public int method2(int binary)
flag = flag<<1;
} return count;
}
3、高階版:將二進位制數的最右邊1刪掉,直到這個二進位制數為0為止。
public int method3(int binary)
return count;
}
4、公升級版(查表法,平行演算法)
查表法:根據奇偶性來分析,如果它是偶數,那麼n的二進位制中1的個數與n/2中1的個數是相同的,比如4和2的二進位制中都有乙個1,6和3的二進位制中都有兩個1。為啥?因為n是由n/2左移一位而來,而移位並不會增加1的個數。如果n是奇數,那麼n的二進位制中1的個數是n/2中1的個數+1,比如7的二進位制中有三個1,7/2 = 3的二進位制中有兩個1。為啥?因為當n是奇數時,n相當於n/2左移一位再加1。
對於任意乙個32位無符號整數,將其分割為4部分,每部分8bit,對於這四個部分分別求出1的個數,再累加起來即可。而8bit對應2^8 = 256種01組合方式,這也是為什麼表的大小為256的原因。注意型別轉換的時候,先取到n的位址,然後轉換為unsigned char*,這樣乙個unsigned int(4 bytes)對應四個unsigned char(1 bytes),分別取出來計算即可。舉個例子吧,以87654321(十六進製制)為例,先寫成二進位制形式-8bit一組,共四組,以不同顏色區分,這四組中1的個數分別為4,4,3,2,所以一共是13個1,如下面所示。
10000111 01100101 01000011 00100001 = 4 + 4 + 3 + 2 = 13
public int method4(int binary)
int searchtable = new int[256];
for(int i=0;i<256;i++)
int flag = 0xff;
for(int i=0;i<4;i++)
return count;
/*return table[n &0xff] +
table[(n >>8) &0xff] +
table[(n >>16) &0xff] +
table[(n >>24) &0xff] ;
*/}
5、平行法:
public int method5(int n)
附錄:int
bitcount5(unsigned
intn)
每天一道演算法題 二進位制中1的個數
題目描述 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。測試用例 0 1 2 10 對應輸出應該為 0 1 1 2 分析 如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1...
每天一道LeeCode7 二進位制求和
二進位制求和 給定兩個二進位制字串,返回他們的和 用二進位制表示 輸入為非空字串且只包含數字1和0。示例 1 輸入 a 11 b 1 輸出 100 示例 2 輸入 a 1010 b 1011 輸出 10101 思路 1 對string短的那個補齊 前面補 0 2 將string轉換為int型別,注意...
每天一道演算法題 醜數
題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 使用兩個佇列乙個存放節點,乙個存放值。先將根節點加入到佇列中,然後遍歷佇列中的元素,遍歷過程中,訪問該元素的左...