每日一道 LeetCode 44 位1的個數

2022-03-17 18:26:25 字數 1656 閱讀 3670

每天 3 分鐘,走上演算法的逆襲之路。

每日一道 leetcode 前文合集

github:

gitee:

編寫乙個函式,輸入是乙個無符號整數,返回其二進位制表示式中數字位數為 『1』 的個數(也被稱為漢明重量)。

示例 1:

輸入:00000000000000000000000000001011

輸出:3

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

示例 2:

輸入:00000000000000000000000010000000

輸出:1

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

示例 3:

輸入:11111111111111111111111111111101

輸出:31

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

這道題和昨天那道題比有點小巫見大巫的感覺,還是在考察二進位制運算。

要知道乙個二進位制中有多少個 1 ,可以從最後一位開始迴圈,和 1 進行比較,前面有過類似的題目,一種常見的套路是取模運算,可以得到最後一位的值,但是如果是乙個 32 位的二進位制,那麼它的第一位是正負號。

所以取二進位制的最後一位通常情況下不適用取模的操作,而是使用位運算&1

我們可以通過&1來驗證最後一位是不是 1 ,同理可以使用&10來驗證倒數第二位是不是 1 ,同理一頓往前推導。

這道題的答案就有了:

public int hammingweight(int n) 

mask <<= 1;

}return count;

}

這道題的答案上是這麼描述這個方案的,這屬於二進位制數處理的乙個小技巧。

當乙個二進位制數 n 同 n - 1 進行位運算 & 時,總是可以把最後一位由 1 變成 0 而其他位保持不變。

這個很好理解,因為是二進位制數, n - 1 和 n 的最後一位肯定乙個是 0 另乙個是 1 ,他們兩個進行一次 & 運算,相當於 0 和 1 進行一次 & 運算,結果當然是 0 。

而 n 如果最後一位是 0 的話,它需要和高位借乙個 1 過來,這感覺有點像十進位制運算時候的借位。

這麼迴圈下去,總有一次會把高位的 1 全都借完,整個 n 變成 0 ,這時迴圈也就結束了,迴圈的次數就是我們這個 n 中擁有 1 的個數。

public int hammingweight_1(int n) 

return count;

}

有了昨天那道題打底,今天的題講道理感覺難度上沒有那麼高了,主要考察的是二進位制的位運算,位運算除了有 & 以外,常用的還有 | 和 ^ 操作,遇到二進位制的題可以優先考慮與一些特殊值的位運算。

Leetcode 每日一道

如果不出意外每天會寫一道演算法題的部落格。如果題目簡單,就一天發布一道。如果題目比較難。我會2 3天發一道演算法的題目。今天寫的這道題目比較簡單。題目如下 解法我是用c 寫的。我的解法的大致想法是 先把需要轉換的矩陣直接轉換成一維的陣列,然後再根據要求把一維中的元素全部截為以c個元素為一組的vect...

每日一道leetcode 最大括號深度

有效括號字串 定義 對於每個左括號,都能找到與之對應的右括號,反之亦然。詳情參見題末 有效括號字串 部分。巢狀深度 depth 定義 即有效括號字串巢狀的層數,depth a 表示有效括號字串 a 的巢狀深度。詳情參見題末 巢狀深度 部分。有效括號字串型別與對應的巢狀深度計算方法如下圖所示 給你乙個...

每日一道 LeetCode 11 外觀數列

每天 3 分鐘,走上演算法的逆襲之路。每日一道 leetcode 前文合集 github gitee 給定乙個正整數 n 1 n 30 輸出外觀數列的第 n 項。注意 整數序列中的每一項將表示為乙個字串。外觀數列 是乙個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。前五項如下 1.1...