亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  每日一題:比特位個數

每日一題:比特位個數

時間:2024-02-14

題目338:比特位計數


給定一個非負整數 num。對于 0 ≤ i ≤ num 范圍中的每個數字 i ,計算其二進制數中的 1 的數目并將它們作為數組返回。

示例1:

輸入: 2輸出: [0,1,1]
示例2:
輸入: 5輸出: [0,1,1,2,1,2]
進階:
  • 給出時間復雜度為O(n*sizeof(integer))的解答非常容易。但你可以在線性時間O(n)內用一趟掃描做到嗎?

  • 要求算法的空間復雜度為O(n)。

  • 你能進一步完善解法嗎?要求在C++或任何其他語言中不使用任何內置函數(如 C++ 中的 __builtin_popcount)來執行此操作。

分析

做此題首先需要知道如何計算一個數的比特位的個數。可以通過(x & x-1)每次消除數字二進制表示形式的最后一個1,代碼如下:

int count(int num) {    int n = 0;    while (num != 0) {        ++n;        num = (num & num-1);    }    return n;}
根據上面計算二進制1個數的代碼分析,我們可以用dp[i]表示數字i的比特位個數,知道dp[i]和dp[i & i-1]相差1個比特位個數,所以就有dp[i]=dp[i & i-1]+1直接看代碼:

代碼

方法1:

class Solution {public:    int count(int num) {        int n = 0;        while (num != 0) {            ++n;            num = (num & num-1);        }        return n;    }
vector<int> countBits(int num) { vector<int> dp(num+1, 0); for (int i = 0; i <= num; ++i) { dp[i] = count(i); } return dp; }};
方法2:
class Solution {public:    vector<int> countBits(int num) {        vector<int> dp(num+1, 0);        for (int i = 1; i <= num; ++i) {            dp[i] = dp[i & (i-1)] + 1;        }        return dp;    }};


主站蜘蛛池模板: 全南县| 县级市| 股票| 株洲县| 平利县| 二连浩特市| 濮阳县| 始兴县| 石阡县| 清水河县| 建瓯市| 浦县| 资阳市| 武宣县| 稷山县| 无为县| 龙岩市| 泾阳县| 乐昌市| 平顶山市| 嘉善县| 秦皇岛市| 衡水市| 台南市| 保德县| 三穗县| 延安市| 加查县| 佳木斯市| 改则县| 广宁县| 金寨县| 广灵县| 大英县| 道孚县| 巫溪县| 鄂伦春自治旗| 都昌县| 福建省| 台中市| 五寨县|