【LeetCode】476.Number Complement_EASY(二)

Anastasia_W發表於2017-04-06

476.Number Complement

Description:
Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

Note:
1. The given integer is guaranteed to fit within the range of a 32-bit signed integer.
2. You could assume no leading zero bit in the integer’s binary representation.

Example 1:
Input: 5
Output: 2
Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.

Example 2:
Input: 1
Output: 0
Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.

以上是題目,因為例子解釋得很清楚就不翻譯題目內容了。

第一眼看這題,就想咋這麼簡單,取反操作不就完了,然後就gg了…
錯誤程式碼:

public class Solution {
    public int findComplement(int num) {
       return ~num;
    }
}

錯誤結果:
這裡寫圖片描述

呵呵,大兄弟,你好像忘了int型別在java裡是儲存為補碼形式的32位數了。

那就趕緊重新整理思路,其實取反操作是沒啥問題,問題是要進行怎樣的操作才能保證前導零不變的同時對其取反,容易想到以下兩個與操作:
1. 輸入數取反前的前導零位在取反後與“0”進行按位與操作;
2. 輸入數取反前最左邊的最高一位及其之後的位在取反後與“1”進行按位與操作;

即我們需要得到一個數,這個數取輸入數的二進位制形式最左邊的最高一位且高位後面全部補“1”。
就得到如下程式碼:

public class Solution {
    public int findComplement(int num) {
       return ~num&((Integer.highestOneBit(num)<<1)-1);
    }
}

結果正確。
PS: highestOneBit(i):這個函式的作用是取 i 這個數的二進位制形式最左邊的最高一位且高位後面全部補零,最後返回int型的結果。

再進一步想,輸入數最左邊的最高位肯定是“1”,取反後為“0”,那進行與操作肯定是“0”,所以在這裡我們可以把左移運算省略,即:

public class Solution {
    public int findComplement(int num) {
       return ~num&(Integer.highestOneBit(num)-1);
    }
}

完成。
還是一行程式碼的事兒……主要還是java的基礎函式吧。

相關文章