LeetCode刷题记录(第七天)

Number Complement

原题目:

Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

Note:

  1. The given integer is guaranteed to fit within the range of a 32-bit signed integer.
  2. You could assume no leading zero bit in the integer’s binary representation.

翻译后:

给定一个正整数,输出其补数。补充策略是翻转其二进制表示的位。

注意:

  1. 给定的整数保证适合在32位有符号整数的范围内。
  2. 你可以在整数的二进制表示中假定没有前导零位。

解释:

说白了,就是给你一个数字,求它二进制的反码是多少。是不是很直观很到位。。。。

思路:

1、首先把传进来的数字转换为二进制;

2、求这个二进制数的反码;

3、求这个反码的值。

因为不用考虑二进制的符号位,所以这个题还是非常简单的,但是如何用代码简单高效的实现,还是得思考思考滴,我自己写的代码如下:

package com.mianshi.suanfa.NumberComplement;

/**
 * Created by macbook_xu on 2018/3/26.
 */
public class Solution {
    public static int findComplement(int num) {
        String two = Integer.toBinaryString(num);//转化二进制

        String newTwo = "";

        for (int i = 0 ; i<two.length() ; i++){//获得反码
            if (two.charAt(i)=='0'){
                newTwo += '1';
            }else {
                newTwo += '0';
            }
        }

        int anw = 0;
        int a = 0;
        for (int i = newTwo.length()-1 ; i>=0 ; i--){
            if (newTwo.charAt(i)=='0'){
                a++;
            }else {
                anw += Math.pow(2,a);//求2的a次方
                a++;
            }
        }
        return anw;
    }

    public static void main(String[] args) {
        System.out.println(findComplement(32));
    }
}

完全按照我自己的思路来写的。。。中间转二进制用的是jdk自带的方法,这算不算偷懒。。。当然,还是有大神厉害的代码:

public class Solution {
    public int findComplement(int num) {
        return ~num & (Integer.highestOneBit(num) - 1);
    }
}

这个代码嘛。。。。我是完全没看懂,也许是我真的太笨了,一行代码,解决问题。我只能解释一下,highestOneBit()这个方法,返回具有至多单个 1 位的 int 值,在指定的 int 值中最高位(最左边)的 1 位的位置。如果指定的值在其二进制补码表示形式中不具有 1 位,即它等于零,则返回零。这是jdk的解释,需要好好理解一下,虽然我现在知道什么意思,但我不知道该怎么把它说明白,还是靠大家自己理解了。。。。。这个代码是非常厉害,还得好好学一学,以后理解了为什么这么实现,再讲。

点赞