劍指 Offer 15. 二進位制中1的個數

majinbo111發表於2020-11-07

劍指 Offer 15. 二進位制中1的個數

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof
著作權歸領釦網路所有。

請實現一個函式,輸入一個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。

示例 1:

輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進位制串 00000000000000000000000000001011 中,共有三位為 ‘1’。

示例 2:

輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進位制串 00000000000000000000000010000000 中,共有一位為 ‘1’。

示例 3:

輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進位制串 11111111111111111111111111111101 中,共有 31 位為 ‘1’。

n & 1 加 n >> 1

//時間複雜度 O(n) = log n,即n轉化為二進指的位數
//第一版
int hammingWeight(uint32_t n) {
    uint32_t count = 0;
    while (n) {
        if (n & 1) {
            count++;
        }
        n = n >> 1;
    }

    return count;
}

// 簡潔版
int hammingWeight(uint32_t n) {
    uint32_t count = 0;
    while (n) {
        count += n & 1;
        n = n >> 1;
    }

    return count;
}

計數 且 n & = n - 1

//這個複雜度取決與 n中1的個數
int hammingWeight(uint32_t n) {
    uint32_t count = 0;
    while (n) {
        count += 1;
        n &= n-1;
    }

    return count;
}

相關文章