算法题每日一练---第59天:插入

1,259 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、问题描述

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

编写一种方法,使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域,不足之处用 0 补齐。具体插入过程如图所示。

题目保证从 i 位到 j 位足以容纳 M, 例如: M = 10011,则 i~j 区域至少可容纳 5 位。

题目链接:插入

二、题目要求

样例

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

考察

1.位运算中等题型、面试题
2.建议用时15~30min

三、问题分析

本题是位运算的第14题,没了解过位运算相关知识点可以看这一篇文章,讲解比较详细:

算法题每日一练---第45天:位运算

刚拿到这题,我想一个个位数判断,开始做的时候发现太麻烦了,而且位运算的优势没发挥出来。打开这题的评论区,有的人(包括我)已经开始摆烂了。

2.png

3.png

看题解的时候发现了一个大佬巧妙的做法,分为三步解决:

1.将N二进制i~j位置上面置为0,异或计算就可以置为0。因为1<<k肯定是N的子集,相同,异或为0
2.将M向左移动i个位置
3.N+M,返回结果

11.png

四、编码实现

class Solution {
public:
    int insertBits(int N, int M, int i, int j) {
        int k;
        for(k=i;k<=j;k++)//将N二进制i~j位置上面置为0
        {
            if(N&(1<<k))
            {
                N=N^(1<<k);//异或计算
            }
        }
        M=M<<i;//将M向左移动i个位置
        return N+M;//N+M,返回结果
    }
};

五、测试结果

4.png

5.png