1. 程式人生 > 實用技巧 >力扣-338-位元位計數

力扣-338-位元位計數

題目描述:求一個非負數的二進位制表示下1的個數。

分析:這道題首先想到的是用位運算來做,LeetCode上還有其他的做法。

如果x的最右一位為1,那麼x&(x-1)就是將x的最後一個1去掉。eg:x = (101)2,x&(x-1)=(100)2 。;可以看出x中1的個數比x(x-1)中1的個數多一個;如果最後一位不是1的話怎麼辦,eg:x=(110)2 ,x&(x-1)=110&101=100。結論還是成立的。那麼我們就可以從小到大依次遞推求解了。
class Solution {
    public int[] countBits(int num) {
        
int[] res = new int[num + 1]; //共有num+1個數 res[0] = 0; for(int i = 1; i <= num; i++) { res[i] = res[i&(i-1)] + 1; } return res; } }

還有一種思路:如果x最後一位是1,那麼x>>1位後,最低位的1移去後,最高位補0。那麼x中1的個數,等於x>>1中1的個數再加1;如果x的最後一位不是1,那麼x和x>>1中1的個數相同。

class
Solution { public int[] countBits(int num) { int[] res = new int[num + 1]; //共有num+1個數 res[0] = 0; for(int i = 1; i <= num; i++){ if((i&1) == 1){ res[i] = res[i>>1] + 1; }else{ res[i] = res[i>>1]; } }
return res; } }