2025-03-08:使两个整数相等的位更改次数。用go语言,给定两个正整数 n 和 k。 你可以从 n 的二进制表示中选择任意

举报
福大大架构师每日一题 发表于 2025/03/08 18:09:45 2025/03/08
【摘要】 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 ...

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)

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。