首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >leetcode - 每日一题 - 3226. 使两个整数相等的位更改次数

leetcode - 每日一题 - 3226. 使两个整数相等的位更改次数

作者头像
飞询
发布2025-08-01 14:56:01
发布2025-08-01 14:56:01
1670
举报
文章被收录于专栏:云同步云同步

位运算

3226. 使两个整数相等的位更改次数

题目

想法

  1. n == k 直接返回 0
  2. n & k != k, 直接返回 -1 (从题目来说,只能将位的值 从1改为0,&:只有两个数中位的数都是1,才为1,所以符合答案的一定能等于 k)
  3. 逐位对比,只要不相等就累加 1,直到等于 0,最后返回累加值

解答

代码语言:javascript
复制
/**
 * 执行用时分布 0 ms 击败 100.00% 复杂度分析 消耗内存分布 39.83 MB 击败 50.85%
 */
public int minChanges(int n, int k) {
    // 相等的不需要更改
    if (n == k){
        return 0;
    }
    int temp = n & k;
    // 从题目来说,只能将位的值 从1改为0,&:只有两个数中位的数都是1,才为1,所以符合答案的一定能等于 k
    if (temp != k){
        return -1;
    }
    int change = 0;
    // int 4 字节,32 位
    for (int i = 0; i < 32; i++) {
        // n & 1 以及 k & 1 都是用于判断当前第一位(二进制位最右边)是否是 1,进而用于判断这两个数中这两位是否是一样的
        if ((n & 1) != (k & 1)){
            change++;
        }
        n >>= 1;
        k >>= 1;
    }
    return change;
}

优化

看了官解的位运算,我发觉我的解法也可以在简便一点点

代码语言:javascript
复制
/**
 * 执行用时分布 0 ms 击败 100.00% 复杂度分析 消耗内存分布 39.65 MB 击败 92.56%
 */
public int minChanges(int n, int k) {
    if (n == k){
        return 0;
    }
    // 从题目来说,只能将位的值 从1改为0,&:只有两个数中位的数都是1,才为1,所以符合答案的一定能等于 k
    if ((n & k) != k){
        return -1;
    }
    // n ^ k: 异或运算,两个数位中,相同为0,不同为1
    // 那么也就是意味着,相同的位数归于 0 了,剩下的就是需要修改的,那么剩下就只需要计算位中 1的 个数即可
    return Integer.bitCount(n ^ k);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 想法
  • 解答
    • 优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档