日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

191. 位 1 的个数 ●

發布時間:2024/1/18 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 191. 位 1 的个数 ● 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

191. 位 1 的個數 ●

描述

編寫一個函數,輸入是一個無符號整數(以二進制串的形式),返回其二進制表達式中數字位數為 ‘1’ 的個數(也被稱為漢明重量)。

示例

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

題解

1. 循環檢查二進制位

直接循環檢查給定整數 n 的二進制位的每一位是否為 1。

具體的,從二進制數低位到高位進行檢查,每次移動 i ? 1 i- 1 i?1 位,并與 1 1 1 做 & 與運算,來檢查第 i i i 低位的數,

  • 時間復雜度: O ( k ) O(k) O(k),其中 k 是 int 型的二進制位數, k = 32 k=32 k=32。我們需要檢查 n 的二進制位的每一位,一共需要檢查 32 位。
  • 空間復雜度: O ( 1 ) O(1) O(1),我們只需要常數的空間保存若干變量。
class Solution { public:int hammingWeight(uint32_t n) {int ans = 0;for(int i = 0; i < 32; ++i){if(n & 1){++ans; // 位移后,最低位為 1 時,則ans++}n >>= 1; }return ans;} };

2. 位運算優化

觀察這個運算: n & ( n ? 1 ) n~\&~(n - 1) n?&?(n?1),其運算結果恰為把 n 的二進制位中的最低位的 1 變為 0 之后的結果。

如: 6 & ( 6 ? 1 ) = 4 , 6 = ( 110 ) 2 , 4 = ( 100 ) 2 6~\&~(6-1) = 4, 6 = (110)_2, 4 = (100)_2 6?&?(6?1)=4,6=(110)2?,4=(100)2?,運算結果 4 即為把 6 的二進制位中的最低位的 1 變為 0 之后的結果。

這樣我們可以利用這個位運算的性質加速我們的檢查過程,在實際代碼中,我們不斷讓當前的 n 與 n?1 做與運算,直到 n 變為 0 即可。因為每次運算會使得 n 的最低位的 1 被翻轉,因此運算次數就等于 n 的二進制位中 1 的個數。

  • 時間復雜度: O ( log ? n ) O(\log n) O(logn)。循環次數等于 n 的二進制位中 1 的個數,最壞情況下 n 的二進制位全部為 1。
  • 空間復雜度: O ( 1 ) O(1) O(1),我們只需要常數的空間保存若干變量。
class Solution { public:int hammingWeight(uint32_t n) {int ans = 0;while(n){ // 還存在 1++ans;n &= n - 1; // 該操作后,最低位的 1 將被翻轉為 0}return ans;} };

總結

以上是生活随笔為你收集整理的191. 位 1 的个数 ●的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。