【Lintcode】1218. Number Complement

記錄演算法發表於2020-12-18

題目地址:

https://www.lintcode.com/problem/number-complement/description

給定一個正整數 x x x,輸出其補數。補數定義是將 x x x的二進位制表示位按位翻轉所得之數(該二進位制表示不應該含前導 0 0 0,除非它自己是 0 0 0)。

可以先求一下 x x x的二進位制表示的長度(去掉所有前導 0 0 0,除非它自己是 0 0 0),設長度是 l l l,則答案就是 ( 1 < < l ) − 1 − x (1<<l)-1-x (1<<l)1x。程式碼如下:

public class Solution {
    /**
     * @param num: an integer
     * @return: the complement number
     */
    public int findComplement(int num) {
        // Write your code here
        int len = 0, tmp = num;
        while (tmp != 0) {
            len++;
            tmp >>= 1;
        }
        
        return (1 << len) - 1 - num;
    }
}

時間複雜度 O ( log ⁡ x ) O(\log x) O(logx),空間 O ( 1 ) O(1) O(1)