转换数字的最少位翻转次数
难度:
标签:
题目描述
代码结果
运行时间: 22 ms, 内存: 15.9 MB
/*
题目思路:
使用 Java Stream API 可以简化位操作的步骤。首先,计算 start 和 goal 的异或值,然后将其转换为二进制字符串,最后统计其中 '1' 的数量。
*/
import java.util.stream.Stream;
public class Solution {
public int minBitFlips(int start, int goal) {
// 计算 start 和 goal 的异或结果
int xor = start ^ goal;
// 统计 xor 中 '1' 的数量
return (int) Stream.of(Integer.toBinaryString(xor).split(""))
.filter(bit -> bit.equals("1"))
.count();
}
}
解释
方法:
这道题目的思路是利用异或运算的性质。异或运算的结果中,每一个为1的位表示两个数在该位上的数字不同。因此,我们可以对start和goal进行异或运算,然后统计结果中1的个数,这个数量就是需要翻转的位数。
时间复杂度:
O(logn)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么选择异或运算来确定需要翻转的位数?是否有其他算法可以达到相同的目的?
▷🦆
在解释中提到异或的结果中的每一个1代表两个数在该位上数字不同,请问这是异或运算的哪一特性体现?
▷🦆
如果start和goal的值非常接近,是否有更优的方法来计算需要翻转的位数,比如直接比较不同位?
▷