国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

( 位運算 ) 190. 顛倒二進制位 ——【Leetcode每日一題】

這篇具有很好參考價值的文章主要介紹了( 位運算 ) 190. 顛倒二進制位 ——【Leetcode每日一題】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?190. 顛倒二進制位

難度:簡單

顛倒給定的 32 位無符號整數的二進制位。

提示:

  • 請注意,在某些語言(如 Java)中,沒有無符號整數類型。在這種情況下,輸入和輸出都將被指定為有符號整數類型,并且不應影響您的實現,因為無論整數是有符號的還是無符號的,其內部的二進制表示形式都是相同的。
  • Java 中,編譯器使用 二進制補碼 記法來表示有符號整數。因此,在 示例 2 中,輸入表示有符號整數 -3,輸出表示有符號整數 -1073741825
示例 1:

輸入:n = 00000010100101000001111010011100
輸出:964176192 (00111001011110000010100101000000)
解釋:輸入的二進制串 00000010100101000001111010011100 表示無符號整數 43261596,
因此返回 964176192,其二進制表示形式為 00111001011110000010100101000000。

示例 2:

輸入:n = 11111111111111111111111111111101
輸出:3221225471 (10111111111111111111111111111111)
解釋:輸入的二進制串 11111111111111111111111111111101 表示無符號整數 4294967293,
因此返回 3221225471 其二進制表示形式為 10111111111111111111111111111111 。

提示:

  • 輸入是一個長度為 32 的二進制字符串

進階: 如果多次調用這個函數,你將如何優(yōu)化你的算法?

??思路:

基礎知識必知:一篇文章搞懂位運算

法一:循環(huán)

  • n 視作一個長為 32 的二進制串,從低位往高位枚舉 n 的每一位,將其倒序添加到翻轉結果 ans 中。
  • 代碼實現中,每枚舉一位就將 n 右移一位,這樣當前 n 的最低位就是我們要枚舉的比特位。當 n0 時即可結束循環(huán)。

需要注意的是,在某些語言(如 Java)中,沒有無符號整數類型,因此對 n 的右移操作應使用邏輯右移(無符號右移)。

法二:分治

若要翻轉一個二進制串,可以將其 均分 成左右兩部分,對每部分 遞歸 執(zhí)行翻轉操作,然后將左半部分拼在右半部分的后面,即完成了翻轉。

由于左右兩部分的計算方式是相似的,利用位掩碼位移運算,我們可以自底向上地完成這一分治流程。

對于遞歸的最底層,我們需要交換所有奇偶位:

  1. 取出所有奇數位偶數位;
  2. 奇數位移到偶數位上,偶數位移到奇數位上。

類似地,對于倒數第二層,每兩位分一組,按組號取出所有奇數組偶數組,然后將奇數組移到偶數組上,偶數組移到奇數組上。以此類推。

??代碼:(Java、C++)

法一:循環(huán)
Java

public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int ans = 0;
        for(int i = 0; i < 32; i++){
            ans <<= 1;
            ans |= (n & 1);
            n >>>= 1;
        }
        return ans;
    }
}

C++

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t ans = 0;
        for(int i = 0; i < 32; i++){
            ans <<= 1;
            ans |= (n & 1);
            n >>= 1;
        }
        return ans;
    }
};

法二:分治
Java

public class Solution {
    // you need treat n as an unsigned value
    private static final int M1 = 0x55555555; // 01010101010101010101010101010101
    private static final int M2 = 0x33333333; // 00110011001100110011001100110011
    private static final int M4 = 0x0f0f0f0f; // 00001111000011110000111100001111
    private static final int M8 = 0x00ff00ff; // 00000000111111110000000011111111

    public int reverseBits(int n) {
        n = n >>> 1 & M1 | (n & M1) << 1;
        n = n >>> 2 & M2 | (n & M2) << 2;
        n = n >>> 4 & M4 | (n & M4) << 4;
        n = n >>> 8 & M8 | (n & M8) << 8;
        return n >>> 16 | n << 16;
    }
}

C++

class Solution {
private:
    const uint32_t M1 = 0x55555555; // 01010101010101010101010101010101
    const uint32_t M2 = 0x33333333; // 00110011001100110011001100110011
    const uint32_t M4 = 0x0f0f0f0f; // 00001111000011110000111100001111
    const uint32_t M8 = 0x00ff00ff; // 00000000111111110000000011111111

public:
    uint32_t reverseBits(uint32_t n) {
        n = n >> 1 & M1 | (n & M1) << 1;
        n = n >> 2 & M2 | (n & M2) << 2;
        n = n >> 4 & M4 | (n & M4) << 4;
        n = n >> 8 & M8 | (n & M8) << 8;
        return n >> 16 | n << 16;
    }
};
?? 運行結果:

( 位運算 ) 190. 顛倒二進制位 ——【Leetcode每日一題】

?? 復雜度分析:
  • 時間復雜度 O ( 1 ) O(1) O(1)。
  • 空間復雜度 O ( 1 ) O(1) O(1)

題目來源:力扣。

放棄一件事很容易,每天能堅持一件事一定很酷,一起每日一題吧!
關注我 leetCode專欄,每日更新!文章來源地址http://www.zghlxwxcb.cn/news/detail-438427.html

注: 如有不足,歡迎指正!

到了這里,關于( 位運算 ) 190. 顛倒二進制位 ——【Leetcode每日一題】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 代碼訓練LeetCode(13)顛倒二進制位

    代碼訓練LeetCode(13)顛倒二進制位

    代碼訓練(13)LeetCode之顛倒二進制位 Author: Once Day Date: 2024年4月9日 漫漫長路,才剛剛開始… 全系列文章可參考專欄: 十年代碼訓練_Once-Day的博客-CSDN博客 參考文章: 190. 顛倒二進制位 - 力扣(LeetCode) 力扣 (LeetCode) 全球極客摯愛的技術成長平臺 1. 原題 顛倒給定的 32 位無符號整

    2024年04月27日
    瀏覽(22)
  • 2023-06-14 LeetCode每日一題(二進制字符串前綴一致的次數)

    點擊跳轉到題目位置 給你一個長度為 n 、下標從 1 開始的二進制字符串,所有位最開始都是 0 。我們會按步翻轉該二進制字符串的所有位(即,將 0 變?yōu)?1)。 給你一個下標從 1 開始的整數數組 flips ,其中 flips[i] 表示對應下標 i 的位將會在第 i 步翻轉。 二進制字符串 前綴

    2024年02月08日
    瀏覽(98)
  • 2023-5-26 LeetCode每日一題(二進制矩陣中的最短路徑)

    點擊跳轉到題目位置 給你一個 n x n 的二進制矩陣 grid 中,返回矩陣中最短 暢通路徑 的長度。如果不存在這樣的路徑,返回 -1 。 二進制矩陣中的 暢通路徑 是一條從 左上角 單元格(即,(0, 0))到 右下角 單元格(即,(n - 1, n - 1))的路徑,該路徑同時滿足下述要求: 路徑途

    2024年02月06日
    瀏覽(91)
  • 【每日一題】1253. 重構 2 行二進制矩陣

    給你一個 2 行 n 列的二進制數組: 矩陣是一個二進制矩陣,這意味著矩陣中的每個元素不是 0 就是 1。 第 0 行的元素之和為 upper。 第 1 行的元素之和為 lower。 第 i 列(從 0 開始編號)的元素之和為 colsum[i],colsum 是一個長度為 n 的整數數組。 你需要利用 upper,lower 和 colsu

    2024年02月12日
    瀏覽(88)
  • C# 顛倒二進制位

    C# 顛倒二進制位

    顛倒給定的 32 位無符號整數的二進制位。 提示: 請注意,在某些語言(如 Java)中,沒有無符號整數類型。在這種情況下,輸入和輸出都將被指定為有符號整數類型,并且不應影響您的實現,因為無論整數是有符號的還是無符號的,其內部的二進制表示形式都是相同的。 在

    2024年02月16日
    瀏覽(22)
  • C語言每日一題之整數求二進制1的個數

    C語言每日一題之整數求二進制1的個數

    今天分享一道題目,用三種方法來求解 二進制1的個數 方法1 我們的十進制除10和取余數就可以得到我們每一位的數字,那我們的二進制也可 以 這是一種方法,另外一種就是我們可以用移位操作符來算 這個方法是不是也是特別妙呢,當然還有更妙的方法,請看!??! 相信看

    2024年02月15日
    瀏覽(90)
  • C語言每日一題(5):求兩個數二進制中不同位的個數

    C語言每日一題(5):求兩個數二進制中不同位的個數

    文章主題:求兩個數二進制中不同位的個數?? 所屬專欄: C語言每日一題 ?? 作者簡介:每天不定時更新C語言的小白一枚,記錄分享自己每天的所思所想???? 個人主頁: [?]的個人主頁 ???? 最近剛學位操作符以及二進制碼的相關知識,于是想出了求兩個數二進制中不同

    2024年02月07日
    瀏覽(848)
  • 【每日一題Day218】LC1091 二進制矩陣中的最短路徑 | BFS

    你駕駛出租車行駛在一條有 n 個地點的路上。這 n 個地點從近到遠編號為 1 到 n ,你想要從 1 開到 n ,通過接乘客訂單盈利。你只能沿著編號遞增的方向前進,不能改變方向。 乘客信息用一個下標從 0 開始的二維數組 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客

    2024年02月08日
    瀏覽(87)
  • 劍指 Offer 15. 二進制中1的個數 / LeetCode 191. 位1的個數(位運算)

    劍指 Offer 15. 二進制中1的個數 / LeetCode 191. 位1的個數(位運算)

    鏈接:劍指 Offer 15. 二進制中1的個數;LeetCode 191. 位1的個數 難度:簡單 編寫一個函數,輸入是一個無符號整數(以二進制串的形式),返回其二進制表達式中數字位數為 ‘1’ 的個數(也被稱為漢明重量)。 提示: 請注意,在某些語言(如 Java)中,沒有無符號整數類型。

    2024年02月12日
    瀏覽(79)
  • DAY001_二進制運算

    無符號左移? Java沒有無符號左移 無符號右移 左邊補0 有符號右移 左邊用原符號位補位 即正數補0效果同無符號右移、負數補1 有符號左移 右邊補0 輸出如下: 此外,根據上面的代碼,我們還可以經過測試得出 int 類型位移32位、64位還是它本身 long 類型位移64位還是它本身 看

    2024年02月13日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包