您的位置:首页 > 其它

LeetCode-476 Number Complement

2017-06-04 10:46 295 查看
Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

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.

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.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
原码、反码、补码的关系:

正数:反码 = 原码。

负数:反码 = 符号位不变,其余位取反。

补码 = 反码+1

补码:计算机中使用的是补码,而不是原码或反码。

   为什么使用补码呢?

进行运算时,可以统一加减法(时钟原理、补码概念)。另外可以让符号位作为数值直接参与计算。

   为什么不使用原码呢? 

1. 使用原码的话,表示0时会出现二义性,[+0]原=00000000,[-0]原=10000000,

     2. 使用原码进行运算时,符号位需要单独处理

反码只是作为补码和原码之间的桥梁

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我的方法虽然通过了,但是感觉实在是太丑陋了,耗时29ms。
public class Solution {
public int findComplement(int num) {
int result=0;
int count=0;
int [] biresult = new int[32];
boolean flag = false;
StringBuilder sb = new StringBuilder();
while(a!=0){
result= a%2;
System.out.println("result: "+result);
biresult[count]=result^1;
count++;
a=a/2;
}
if(count ==1){
System.out.println(biresult[count-1]);
}
if(count >1){
for(int i= count-1;i>=0;i--){
if(!flag && biresult[i] !=0){
flag = true;
}
if(flag){
sb.append(biresult[i]);
}
}
if(!flag){
sb.append(0);
}

}
return Integer.parseInt(sb.toString(),2);
}
}


太丑陋了!!!!
比较好的方法如下,耗时9ms:
public class Solution {
public int findComplement(int num) {
int complementary = 0;
int i = 31;
while(((1<<i) & num)==0) i--;
while(i >= 0){
int mask = (1 << i);
int value = mask & num;
if(value == 0) complementary |= mask;
i--;
}
return complementary;
}
}


(1<<i) & num:找到lead位置
mask:左移leader位于num相与。如果与后结果为0,则表示位与num的位相反,然后与将要返回的结果做或操作,添加的结果的i位。
返回结果。

需要学习的地方:
1. 可用左移与的操作找到leader位。
2. mask的使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息