当前位置: 首页 > article >正文

LeetCode3226题. 使两个整数相等的位更改次数(原创)

【题目描述】

给你两个正整数 n 和 k

你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。

返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。

示例 1:

输入: n = 13, k = 4

输出: 2

解释:
最初,n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2

我们可以改变 n 的第一位和第四位。结果整数为 n = (0100)2 = k

示例 2:

输入: n = 21, k = 21

输出: 0

解释:
n 和 k 已经相等,因此不需要更改。

示例 3:

输入: n = 14, k = 13

输出: -1

解释:
无法使 n 等于 k

提示:

  • 1 <= n, k <= 106

题目链接:. - 力扣(LeetCode)

【解题代码】

package number;

import string.CountAndSay;

public class MinChanges {

    public static void main(String[] args) {
        //int n = 13, k = 4;
        //int n = 21, k = 21;
        int n = 14, k = 13;
        int result = new MinChanges().minChanges(n, k);
        System.out.println("计算结果:" + result);
    }

    public int minChanges(int n, int k) {
        int count = 0;
        int bit1, bit2;
        for (int i = 0; i < Integer.SIZE; i++) {
            bit1 = (n >> i) & 0x01;
            bit2 = (k >> i) & 0x01;
            if (bit1 == 1 && bit2 == 0) count++;
            if (bit1 == 0 && bit2 == 1) return -1;
        }

        return count;
    }
}

【解题思路】

根据题意可以总结出使得n能转变成k的条件是不存在某一bit位,n为0而k为1;另外n转变成k更改次数等于所有的n为1,而k为0的bit位数量之和。算法大致步骤如下,按照整数32位,逐次遍历n和k的第i位比特数值:

  1. 如果n和k的第i位比特数值都是0,那么不做任何处理;
  2. 如果n的第i位比特数值是1,k的第i位比特数值是0,那么返回的数值加1;
  3. 如果n的第i位比特数值是0,k的第i位比特数值是1,那么无法使n等于k,直接返回-1;

根据此思路很快完成代码编写,并提交成功

【解题步骤】

  1. 定义三个整形变量,count:更改次数;bit1:n的当前bit位数值(0或1);bit2:k的当前bit位数值(0或1)
    int count = 0;
    int bit1, bit2;
  2. 从0到31,依次获取n和k的所有bit位
    for (int i = 0; i < Integer.SIZE; i++) {
        bit1 = (n >> i) & 0x01;
        bit2 = (k >> i) & 0x01;
  3. 如果bit1数值是1,bit2是0,那么返回的结果count加1;
    if (bit1 == 1 && bit2 == 0) count++;
  4. 如果bit1数值是0,bit2是1,那么返回的数值加1,那么无法使n等于k,直接返回-1;
    if (bit1 == 0 && bit2 == 1) return -1;

【思考总结】

  1. 此算法关键思路是使得n能转变成k的条件是不存在某一bit位,n为0而k为1;另外n转变成k更改次数等于所有的n为1,而k为0的bit位数量之和。
  2. 大家需要熟练掌握java中对整数的各种位操作;
  3. LeetCode解题之前,一定不要看题解,看了就“破功”了!

http://www.kler.cn/a/377271.html

相关文章:

  • Ubuntu使用Qt虚拟键盘,支持中英文切换
  • PMP–一、二、三模、冲刺–分类–7.成本管理–技巧–挣值分析
  • Windows安装多个NodeJS版本
  • html练习2
  • Spring Boot 与 Vue 共筑高校网上订餐卓越平台
  • el-checkbox勾选一个变成了勾选所有
  • CSS 动画:网页设计的动态之美
  • ubuntu df -h分配的磁盘空间小于物理磁盘
  • mysql8 window 免安装
  • 【Qt聊天客户端-min_Bug】客户端请求失败分析
  • 杂货 | 每日资讯 | 2024.11.1
  • 使用Nginx作为反向代理和负载均衡器
  • RabbitMQ最全教程-Part2(高阶使用)
  • 【Linux系列】Linux 系统中的软连接管理
  • 科学教育与少儿编程:同向同行,共育新时代科技人才
  • RabbitMQ的解耦、异步、削峰是什么?
  • java医院绩效管理系统源码,采用B/S架构,开发工具:maven、Visual Studio Code,医院绩效管理系统数据流程解析
  • 使用 Docker Compose 将数据版 LobeChat 服务端部署
  • 无人机高山景区物资吊运技术及前景分析
  • 【OJ题解】C++实现反转字符串中的每个单词
  • 拿不到kafka消息可能是什么原因?
  • 图像压缩——图像压缩的保真度准则与压缩性能参数
  • 【那些年踩过的坑-前端篇- Mac版本】npm init vite 失败,报错`CERT_HAS_EXPIRED npm ERR
  • Python自动化操作Word文档详解
  • 在VB.NET中,Try...Catch...Finally 和On Error Resume Next有什么区别
  • K8S自建企业私有云方案 单台起配 NVMe全闪存储性能