這是小川的第377次更新,第404篇原創
java
今天介紹的是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
題目的意思是將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; }
思路:將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); }
思路和第一種解法相似,只是換了另外的方式來獲得全是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); }
算法專題目前已連續日更超過七個月,算法題文章244+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,好看、留言、轉發就是對我最大的回報和支持!