整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。
示例1:
输入:A = 29 (或者0b11101), B = 15(或者0b01111)
输出:2
示例2:
输入:A = 1,B = 2
输出:2
提示:
- A,B范围在[-2147483648, 2147483647]之间
分析:
方法1:朴素解法
一位一位进行比较,每有一位不一样就计数。注意:因为存在负数情况,要采用无符号移位。
时间复杂度:O(C) 最坏情况,遍历到最后一位,C 为 31
空间复杂度:O(1)
class Solution {
public int convertInteger(int A, int B) {
//计数不一样的位数
int count = 0;
//遍历,当两个数都为0时停止遍历
while(A != 0 || B != 0){
//第一位不一样,计数
if((A & 1) != (B & 1)){
count++;
}
//A B右移
A >>>= 1;
B >>>= 1;
}
return count;
}
}
方法2:异或运算
有 方法1 可知我们需要计数不一样的位,而异或运算的特点就是相同取0,不同取1,因此我们只需要将两数进行异或运算,然后返回 1 的数量即可。
时间复杂度:O(C)
空间复杂度:O(1)
class Solution {
public int convertInteger(int A, int B) {
return Integer.bitCount(A ^ B);
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-integer-lcci