• 首页

  • 归档

  • 标签

  • 分类

  • 友链
M S B l o g
M S B l o g

ms

获取中...

04
29
java
总结
问题

【力扣】插入

发表于 2021-04-29 • java 问题 力扣 • 被 912 人看爆

题目:

给定两个整型数字 N 与 M,以及表示比特位置的 i 与 j(i <= j,且从 0 位开始计算)。

编写一种方法,使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域,不足之处用 0 补齐。具体插入过程如图所示。
1610104070-NuLVQi-05.01
题目保证从 i 位到 j 位足以容纳 M, 例如: M = 10011,则 i~j 区域至少可容纳 5 位。

 

示例1:

输入:N = 1024(10000000000), M = 19(10011), i = 2, j = 6
输出:N = 1100(10001001100)
示例2:

输入: N = 0, M = 31(11111), i = 0, j = 4
输出:N = 31(11111)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insert-into-bits-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解一:

思路:

  • 先把数N的j到i之间的位置的数字变为0
  • M左移i位
  • 再用N或运算M
例 N = 1011 1111, M = 101, i = 2, j = 4
   先(1<<(j-i+1))-1)<<i = 0001 1100      
取反后
     1110 0011                       //(1<<(j-i+1))-1)这样计算出的数取反后能把数 N 中 i 到 j 位置置为0
对N于运算
     1011 1111 & 1110 0011 = 1010 0011       //把上一步的0替换到 N 中 i 到 j 位
M左移动i位
    101 << i = 0001 0100                // M的数组移到i 到 j 位中
最后M|N
    0001 0100 | 1010 0011 = 1011 0111 = 183    //两者结合即为答案

代码:

class Solution {
    public int insertBits(int N, int M, int i, int j) {
        int mask=((1<<(j-i+1))-1)<<i;
        mask = ~mask;
        N &= mask;
        M <<= i;
        return N | M;
    }
}

题解二:

思路:

  • 先将对应位清零,然后将M异或上去

代码:

class Solution {
    public int insertBits(int N, int M, int i, int j) {
        for (int k = i; k <= j; k++) {

            int mask = 1 << k;
            if ((N & mask) == mask)
                N -= mask;
        }
        
        return N ^ (M << i);
    }
}

分享到:
GET和POST的区别
负数的二进制
  • 文章目录
  • 站点概览
ms

MSms

⚓️HelloWorld⚓️

QQ Email RSS
看爆 Top5
  • MyBatis-Plus分页查询 5,937次看爆
  • @Autowired与@Resource的区别 4,755次看爆
  • feign远程调用及异步调用丢失请求头问题 4,527次看爆
  • spring cloud中OpenFeign整合Sentinel启动报错 4,425次看爆
  • Certbot查看证书过期时间,手动续期以及自动续期 3,302次看爆

Copyright © 2025 ms · 湘ICP备20015239号

Proudly published with Halo · Theme by fyang · 站点地图