题目:
每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 "101",11 可以用二进制 "1011" 表示,依此类推。注意,除 N = 0 外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。
给你一个十进制数 N,请你返回其二进制表示的反码所对应的十进制整数。
示例:
输入:5
输出:2
解释:5 的二进制表示为 "101",其二进制反码为 "010",也就是十进制中的 2 。
解题方法:
开始想的是每次取N最后一位数然后计算对应的S值,然后将S值不断累加就可以了,仔细一想还可以更简单的一点,就是直接用减法计算:
得到N的二进制位数K,然后计算K位二进制数全为1的时候十进制值M,M可以通过等比数列求和公式计算得到;然后把M-N作为结果就可以了,因为M和N对应位置上都为1的话,结果S的二进制对应位置就是0,不全为1的话S对应位置就是1。
代码和结果:
class Solution {
public:
int bitwiseComplement(int N) {
if(N==0)
return 1;
int S=0;
int cnt=0;
int T=N;
while(T>0)
{
T=T>>1;
cnt++;
}
int total=pow(2,cnt)-1;
S=total-N;
return S;
}
};
运行结果:
![](https://img.haomeiwen.com/i11138240/3b6da2dbd204a7c4.png)
运行结果出奇的好,第一次运行的时候出了错,因为没有考虑输入为0的情况,我的程序最不满意的地方就是关于0需要单独考虑。这道题比较简单,还能应付,如果复杂了,这种特殊情况就不一定这么简单就能解决,所以不太喜欢这个特殊值。第二次通过了,但是执行用时没有那么好。最后一次就是把计算total的公式稍微调整了一下,然后就是上面的结果了,不太明白少了一个除法为什么能有这么大的提升。
原题链接:https://leetcode-cn.com/problems/complement-of-base-10-integer/
网友评论