2025-03-08:使两个整数相等的位更改次数。用go语言,给定两个正整数 n 和 k。
你可以从 n 的二进制表示中选择任意一个位,如果该位为 1,则可以将其改为 0。
请返回将 n 改为 k 所需的改动次数。如果无法做到,返回 -1。
1 <= n, k <= 1000000。
输入: n = 13, k = 4。
输出: 2。
解释:
最初,n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2,
我们可以改变 n 的第一位和第四位。结果整数为 n = (0100)2 = k。
大体步骤如下:
1.定义函数minChanges(n int, k int),用于计算使两个整数相等的位更改次数。在给定的正整数 n 和 k 中,通过选择 n 的二进制表示中的任意一位,如果该位为 1,则可以将其改为 0。函数返回将 n 改为 k 所需的改动次数,无法做到返回 -1。
2.在主函数main中,初始化两个整数 n 和 k 分别为 13 和 4,然后调用minChanges函数计算并输出结果。
3.对于输入 n = 13 和 k = 4:
• 将 n 和 k 的二进制表示分别视为 (1101)2 和 (0100)2。
• 因为我们可以改变 n 的第一位和第四位,所以可以将 13 改为 4,即 n = (0100)2 = k。
• 需要改动的次数为 2。
总的时间复杂度:O(1),因为无论输入的 n 和 k 多大,算法的执行时间都是常数级的。
总的额外空间复杂度:O(1),因为算法只使用了常数级的额外空间。
Go完整代码如下:
package main
import (
"fmt"
"math/bits"
)
func minChanges(n int, k int)int {
if (n & k) == k {
return bits.OnesCount(uint(n ^ k))
} else {
return-1
}
}
func main() {
n := 13
k := 4
result := minChanges(n, k)
fmt.Println(result)
}
在这里插入图片描述Python完整代码如下:
# -*-coding:utf-8-*-
def min_changes(n, k):
# 检查 n 是否可以通过修改将其变为 k
if (n & k) == k:
return bin(n ^ k).count('1') # 计算不同位的个数
else:
return -1
if __name__ == "__main__":
n = 13
k = 4
result = min_changes(n, k)
print(result)
在这里插入图片描述
领取专属 10元无门槛券
私享最新 技术干货