Given a positive integer, output its complement number. The complement strategy is to flip the bits of its 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.
Note:
- The given integer is guaranteed to fit within the range of a 32-bit signed integer.
- You could assume no leading zero bit in the integer’s binary representation.
- This question is the same as 1009: https://leetcode.com/problems/complement-of-base-10-integer/
这个题目,第一反应是用std::bistset,然后逐位取反,但是考虑到bitset的构造需要指定位数,要是逐位取反,岂不是前面补充的0都取反成1了?所以还是从最原始的想法开始,自己从int来构造binariy。
每一位的表示,从高位还是低位,取反后重新构造要弄清楚。
然后想到了std::stack,先进去的是低位,后进去的是高位,正好在重新构造新的flip数字时,是从高位开始处理,取反,乘以2加低位。
这里说下,本来采用的是 "~"运算符,无论是int还是unsigned int都有问题,采用了xor 1之后运行正常。
好了,方案就是这样。
class Solution {
public:
int findComplement(int num) {
if(num == 0)
return 1;
stack<int> sk;
while(num != 0)
{
int left = num % 2;
sk.push(left);
num = num / 2;
}
int res = 0;
while(not sk.empty())
{
unsigned int top = sk.top();
sk.pop();
top = top xor 1;
res = res * 2 + top;
}
return res;
}
};
运行效果,不过哈?
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Number Complement.
Memory Usage: 6.3 MB, less than 100.00% of C++ online submissions forNumber Complement.