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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 231. 2的幂 LeetCode 338. 比特位计数(2进制1的个数)

發(fā)布時(shí)間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 231. 2的幂 LeetCode 338. 比特位计数(2进制1的个数) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 題目信息
    • 2. 解題
      • 拓展:求一個(gè)數(shù)n的2進(jìn)制有多少個(gè)1?
      • LeetCode 338

1. 題目信息

給定一個(gè)整數(shù),編寫一個(gè)函數(shù)來判斷它是否是 2 的冪次方。

示例 1:輸入: 1 輸出: true 解釋: 20 = 1 示例 2:輸入: 16 輸出: true 解釋: 24 = 16 示例 3:輸入: 218 輸出: false

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/power-of-two
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

2. 解題

  • 2的整數(shù)次冪的2進(jìn)制數(shù)中只有1個(gè)1
  • n經(jīng)過 運(yùn)算 n&(n-1) 得到的數(shù)的二進(jìn)制1的個(gè)數(shù)減少1個(gè)

class Solution { public:bool isPowerOfTwo(int n) {if(n <= 0)return false;return (n&(n-1)) == 0;//錯(cuò)誤寫法 n&(n-1) == 0} };

拓展:求一個(gè)數(shù)n的2進(jìn)制有多少個(gè)1?

int count = 0, num = 8; while(num) {count++;num = num&(num-1); } std::cout << count << std::endl;

LeetCode 338

給定一個(gè)非負(fù)整數(shù) num。對(duì)于 0 ≤ i ≤ num 范圍中的每個(gè)數(shù)字 i ,計(jì)算其二進(jìn)制數(shù)中的 1 的數(shù)目并將它們作為數(shù)組返回。

class Solution { public:vector<int> countBits(int num) {int count, temp;vector<int> ans;for(int i = 0; i <= num; ++i){count = 0;temp = i;while(temp){temp &= (temp-1);++count;}ans.push_back(count);}return ans;} };

對(duì)338題還可以用動(dòng)態(tài)規(guī)劃

  • dp[0] = 0
奇數(shù)偶數(shù)
1-‘01’-dp[1]=12-‘10’-dp[2]=1
3-‘11’-dp[3]=24-‘100’-dp[4]=1
5-‘101’-dp[5]=26-‘110’-dp[6]=2
7-‘111’-dp[7]=38-‘1000’-dp[8]=1

n為奇數(shù),dp[n]=dp[n?1]+1n為奇數(shù),dp[n] = dp[n-1]+1n數(shù)dp[n]=dp[n?1]+1,比前面的多1,好理解
n為偶數(shù),dp[n]=dp[n/2]n為偶數(shù),dp[n]=dp[n/2]n數(shù)dp[n]=dp[n/2],2的倍數(shù),只需要移動(dòng)位數(shù)就可以,1個(gè)數(shù)不變

class Solution { public:vector<int> countBits(int num) {vector<int> ans(num+1);ans[0] = 0;for(int i = 0; i <= num; ++i){if(i % 2 == 1){ans[i] = ans[i-1] + 1;}else{ans[i] = ans[i/2];}}return ans;} }; 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的LeetCode 231. 2的幂 LeetCode 338. 比特位计数(2进制1的个数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。