其他分享
首页 > 其他分享> > LeetCode每日刷题Day16---L476数字的补数

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