前言

每天和你一起刷 LeetCode 每日一题~

LeetCode 启动!

【LeetCode】每日一题 2024_11_2 使两个整数相等的位更改次数(位运算/模拟)-LMLPHP

题目:使两个整数相等的位更改次数

【LeetCode】每日一题 2024_11_2 使两个整数相等的位更改次数(位运算/模拟)-LMLPHP

代码与解题思路

先读题:

题目要我们把 n 这个数字转换成 k 这个数字,但是只能是二进制位 1 转换成 0

纯模拟的解法:

func minChanges(n int, k int) (ans int) {
    for n > 0 {
        // 选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0
        if n&1 == 1 {
            if k == 0 || k&1 == 0 {
                ans++
            }
        }
        // 假如 k > n,或者出现 n 的位是 0 而 k 的位是 1 的情况,返回 -1
        if k > n || k > 0 && n&1 == 0 && k&1 == 1 {
            return -1
        }
        n >>= 1
        k >>= 1
    }
    return ans
}

位运算的解法:

n&k != k,假如出现有二进制位 n 是 0,k 是 1 的情况, n&k 就不等于 k,可以用来直接判断是否返回 -1

bits.OnesCount 能找到二进制位是 1 的数量,按位异或,相同为 0,相异为 1

func minChanges(n, k int) int {
	if n&k != k {
		return -1
	}
	return bits.OnesCount(uint(n ^ k))
}

每天进步一点点,我们明天不见不散~

11-04 21:07