LeetCode《程序员面试金典》面试题 05.01. 插入

LeetCode 面试题 05.01. 插入

  • 题目
  • 解题

题目

LeetCode《程序员面试金典》面试题 05.01. 插入_第1张图片
LeetCode《程序员面试金典》面试题 05.01. 插入_第2张图片

解题

在这里插入图片描述
LeetCode《程序员面试金典》面试题 05.01. 插入_第3张图片
LeetCode《程序员面试金典》面试题 05.01. 插入_第4张图片
~0 其实是 -1,二进制的32位上全是1,即 0xFFFF,但是悲伤的是 JS 做位运算时,如果超过32 位会进行截取,因为最大的 j 输入是 31,最大的 j + 1 为 32,-1 << 32 = -1,无法达到想要的结果。

在 JS 中
-1 << 0     // -1
-1 << 31    // -2147483648
-1 << 32    // -1,即 结果等于 -1 << (32 - 32)

所以需要在计算 left 时,加一句判断:

// javascript
var insertBits = function(N, M, i, j) {
    let left = (j === 31) ? 0 : (-1 << (j + 1)),
        right = (1 << i) - 1;
        mask = left | right,
        n_cleared = N & mask,
        m_shifted = M << i;
    return n_cleared | m_shifted;
};

或者用下面两种方法:

// javascript
var insertBits = function(N, M, i, j) {
    let mask = ((1 << (j - i + 1)) - 1) << i;
    mask = ~mask;
    let n_cleared = N & mask;
    let m_shifted = M << i;
    return n_cleared | m_shifted;
};
// javascript
var insertBits = function (N, M, i, j) {
    for (let x = i; x <= j; x++) {
        N &= ~(1 << x);
    }
    return N | M << i;
};

位运算的妙用可以参考 JS位运算符的妙用与原理

你可能感兴趣的:(程序员面试金典,算法,数据结构,面试)