面试题 05.06. 整数转换

题目

整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。

示例1:

输入:A = 29 (或者0b11101), B = 15(或者0b01111)
输出:2

示例2:

输入:A = 1,B = 2
输出:2

提示:

A,B范围在[-2147483648, 2147483647]之间


解题思路

1.^异或运算,数1的个数

  • 但是这个方法有个注意点就是:如果遇到826966453 与 -729934991这种一正一副的数,那么最高位异或运算会变成1!这个样子的话得到一个副值,如果用移位操作的话,-1>>1等于-1会陷入死循环!
  • 我这里做的是判断一下异或结果如果为负数,那么就跟Integer.MAX_VALUE进行与操作,数一下除了最高位的1以外还有多少1存在,最后返回的时候+1就好。

代码:

class Solution {
    public int convertInteger(int A, int B) {
        int a = A ^ B;
        int sum = 0;
        if (a<0){
            int b = a & Integer.MAX_VALUE;
            while (b!=0){
                if (b%2==1){
                    sum++;
                }
                b = b>>1;
            }
            return sum+1; //注意这里加1的意思是返回最高位,表示符号为的1
        }else{
            while (a != 0){
                if (a%2==1){
                    sum++;
                }
                a = a>>1;
            }
            return sum;
        }
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.convertInteger(826966453, -729934991));
    }
}

性能:
在这里插入图片描述


1.2位运算

代码思路:

  • 不用分异或结果是正是负!
  • 因为二进制的补码缘故,写几次就会发现,无论是征服,只要对数进行-1操作,就能改变二进制从低位到高位的第一个1的值。然后每次a = a&(a-1);,每次就可以消掉最低位的1,就可以数出到底有多少个1存在。
  • 有点抽象,建议还是写个例子比如 21 & 20…
class Solution {
    public int convertInteger(int A, int B) {
        int a = A ^ B;
        int sum = 0;
        while (a != 0) {
            sum++;
            a = a&(a-1);
        }
        return sum;
    }
}

性能:

  • 少创建了个变量…但其实都是O(1)的空间复杂度
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值