LeetCode 2220.转换数字的最少位翻转次数

一、题目

二、知识点

符号

描述

运算规则

&

两位都为1结果为1

|

两位都为0结果为0

^

异或

两位相同为0不同为1

~

取反(非)

0变1,1变0

<<

左移

二进制位全部左移,高位丢弃,低位补0

>>

右移

二进制位全部右移,低位丢弃,高位补符号位

>>>

无符号右移

二进制位全部右移,低位丢弃,高位补0

  • 左移和右移可以做乘除运算,例如除2可以右移一位。
  • 右移和无符号右移的区别在于负数的时候不一样,>>负数的时候高位补1,>>>负数的时候高位补0。

三、解题

注:本文均是Java代码

1、方案一

class Solution {
    public int minBitFlips(int start, int goal) {
        // 二进制位有多少个不同 
        int result= 0;
        int index = start ^ goal;    // 相同为0,不同为1
        // 计算变量中有多少个不同(即1),不同的个数就是最少翻转次数
        while (index > 0) {    // 一旦变量值等于0,后边不会有不同
            result += index & 1;    // 判断最后一位是0还是1,是什么就加什么
            index = index >> 1;    // 右移一位
        }
        return result;
    }
}

2、方案二

class Solution {
    public int minBitFlips(int start, int goal) {
        // 二进制位有多少个不同 
        int result = 0;
        for (int i = 0; i < 32; i++) {
            // 判断第i位是0还是1
            // int x = (start & (1 << i)) == 0 ? 0 : 1;
            // int y = (goal & (1 << i)) == 0 ? 0 : 1;
            // 可以不用三元运算符比较是0还是1,直接比就行(比的就是这一位上是什么)
            int x = start & (1 << i);
            int y = goal & (1 << i);
            if (x != y) result++;
        }   
        return result;     
    }
}

3、说明

无论采用哪种方案,归根结底都是通过位运算找到有多少个不同的位。

相关推荐

  1. LeetCode 1671. 得到山形数组最少删除次数

    2024-04-08 14:52:01       49 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 14:52:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 14:52:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 14:52:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 14:52:01       20 阅读

热门阅读

  1. mysql锁

    mysql锁

    2024-04-08 14:52:01      11 阅读
  2. docker 之 基本命令

    2024-04-08 14:52:01       13 阅读
  3. docker build 构建不出新镜像一直都是老镜像

    2024-04-08 14:52:01       13 阅读
  4. 第十四届蓝桥杯c++组B组做题笔记

    2024-04-08 14:52:01       13 阅读
  5. AJAX

    AJAX

    2024-04-08 14:52:01      17 阅读
  6. 机器学习(Machine Learning)知识点

    2024-04-08 14:52:01       15 阅读
  7. C++11:explicit 关键字

    2024-04-08 14:52:01       13 阅读