[LeetCode] 476. Number Complement

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.

这里的complement number是指二进制上的补,两个数的二进制加起来全是1(不包括前面的0)

用刚好比num大的二进制全是1的数-num就得到了complement number

这个解法比较易懂,但从运行时间上看不是最优解

int findComplement(int num)
{
    int sum = 0;
    int tmp = 1;
    while (sum < num)
    {
        sum += tmp;
        tmp = tmp << 1;
    }

    return sum - num;
}

看看LeetCode上其他版本的代码,主要的代码是拿到二进制中最左边那个1

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int findComplement(int num) {
        int toggled = num;

        int topBit = static_cast<int>(log2(num));  //得到num的最左边一个1的位置(把leading zero排除在外)
        for (int iBit = 0; iBit <=topBit; iBit++) {
            toggled ^= (1 << iBit);     //(num的每一位和1做^操作取反)
        }

        return toggled;
    }
};

posted @ 2018-08-14 10:58  arcsinW  阅读(95)  评论(0编辑  收藏  举报