【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)

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