LeetCode每日刷题Day16---L476数字的补数
作者:互联网
L476数字的补数
思路与结果
代码思路1
package Day16_6_5.L476;
/**
* 思路1
1. 三个思路都是通过与1异或的方法去实现的,关键就在于怎样去寻找这个异或对象的大小
2. 通过Integer.toBinaryString()方法,将数字转成二进制字符串
3. 根据字符串长度l,设置一个2^l-1大小的数字,其二进制表示就长度未L的11111···
4. 返回 这个数字与原数字的异或值即可。
反思
1. 用了Integer.toBinaryString()和Math.pow()两个方法,有点麻烦,直接通过移位来寻找该数字。
*/
public class Solution {
public int findComplement(int num) {
//与每一位都是1的数字异或即可。
String s = Integer.toBinaryString(num);
double a = Math.pow(2, s.length()) - 1;
return (int)a ^ num;
}
}
代码思路2
package Day16_6_5.L476;
/**
* 思路2
1. 先通过Integer.toBinaryString()方法,将数字转成二进制字符串
2. 设置变量c=0
3. 根据其长度循环
a. C = (c << 1)+1
b. 这样就可以根据原数字的长度,找到同样长度的11111···
4. 异或返回
反思
1. 还是用到了Integer.toBinaryString()方法,还可以更简单
*/
public class Solution2 {
public int findComplement(int num) {
String s = Integer.toBinaryString(num);
int c =0;
for (int i = 0; i < s.length(); i++) {
c = (c << 1) + 1;
}
return num ^ c;
}
}
代码思路3
package Day16_6_5.L476;
/**
* 思路3
1. 先用temp存储原num值
2. while循环,条件为temp > 0
a. Temp 右移一位
b. C = (c << 1)+1
c. 这样其实就是通过temp的移位,确定二进制的位数
3. 异或返回
*/
public class Solution3 {
public int findComplement(int num) {
int temp = num;
int c =0;
while (num > 0){
num >>= 1;
c = (c << 1 ) + 1;
}
return temp^ c;
}
}
标签:数字,L476,异或,Day16,num,Integer,思路,补数 来源: https://blog.csdn.net/weixin_42252770/article/details/100156393