【Lintcode】179. Update Bits

题目地址:

https://www.lintcode.com/problem/update-bits/description

给定两个3232位整数nnmm,再给定两个取值在0310\sim 31的两个整数iijj,并且i<ji<j,要求将nn的右数第iijj位改变为mm,题目保证mm的二进制表示的长度正好是ji+1j-i+1

思路是,先将nn的第iijj位都变为00,然后将mm左移ii位再与nn或起来即可。代码如下:

public class Solution {
    /**
     * @param n: An integer
     * @param m: An integer
     * @param i: A bit position
     * @param j: A bit position
     * @return: An integer
     */
    public int updateBits(int n, int m, int i, int j) {
        // write your code here
        // 构造二进制表示为j - i + 1个1组成的数
        int ones = ~0 >>> (32 - (j - i + 1));
        // 将n的第i到j位改为0
        n = n & (-1 - (ones << i));
        // 将m左移i位再与n或
        n |= m << i;
        
        return n;
    }
}

时空复杂度O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章