LeetCode.1009-十進制數的補碼(Complement of Base 10 Integer)

這是小川的第377次更新,第404篇原創

java

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第238題(順位題號是1009)。每一個非負整數N都具備二進制表示。例如,5能夠二進制表示爲"101",11能夠二進制表示爲"1011",依此類推。算法

請注意,除N = 0外,任何二進制表示中都沒有前導零。數據結構

二進制表示的補碼是將1改成0和將0改成1時獲得的二進制數。例如,二進制中"101"的補碼是二進制的"010"app

對於給定的十進制數N,將其二進制表示的補碼做爲十進制的整數返回。ui

例如:code

輸入:5
輸出:2
說明:5是二進制"101",二進制補碼"010",轉爲十進制是2。字符串

輸入:7
輸出:0
說明:7是二進制"111",二進制補碼"000",轉爲十進制是0。string

輸入:10
輸出:5
說明:10是二進制"1010",二進制補碼"0101",轉爲十進制是5。it

注意class

  • 0 <= N < 10^9

02 第一種解法

題目的意思是將N轉爲二進制,再求其二進制的補碼(0和1互換),再將轉換後的二進制補碼轉爲十進制整數。

思路:利用異或位運算,例如5^7=2,那麼咱們要找到7,而7的二進制爲111,長度和5的二進制101相等,可是全爲1,因此先將5轉爲二進制字符串,使用一個32位長度的由1組成的字符串,截取對應長度的子串,再將截取出來的子串轉爲十進制數,利用獲得的十進制數和N異或運算就可獲得結果。

public int bitwiseComplement(int N) {
    String str = Integer.toBinaryString(N);
    String newStr = "11111111111111111111111111111111";
    newStr = newStr.substring(0, str.length());
    int num = Integer.valueOf(newStr, 2);
    return N^num;
}


03 第二種解法

思路:將N轉爲二進制字符串,利用循環,將其中的0轉爲1,1轉爲0,變成新的二進制字符串,再將其轉爲十進制整數。

public int bitwiseComplement2(int N) {
    String str = Integer.toBinaryString(N);
    StringBuilder sb = new StringBuilder();
    for (int i=0; i<str.length(); i++) {
        sb.append(str.charAt(i) == '0' ? '1' : '0');
    }
    return Integer.valueOf(sb.toString(), 2);
}


04 第三種解法

思路和第一種解法相似,只是換了另外的方式來獲得全是1的二進制數,全是1的二進制數能夠經過1開頭後面跟0的二進制數減1獲得,例如8的二進制數1000,8減去1獲得7,7的二進制數是111,而8能夠經過1左移位運算3獲得(也能夠累乘2三次獲得)。

public int bitwiseComplement3(int N) {
    if (N < 2) {
        return N == 0 ? 1 : 0;
    }
    int num = 1;
    while (num <= N) {
        // 換成 num *= 2; 效果同樣
        num <<= 1;
    }
    return N^(num-1);
}


05 小結

算法專題目前已連續日更超過七個月,算法題文章244+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,好看、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索