簡體   English   中英

5.1破解編碼面試中的解決方案是否錯誤?

[英]Is the solution of 5.1 in Cracking the Coding Interview wrong?

因為我即將進行技術面試,所以最近我開始學習《破解編碼面試》一書。

當我練習5.1的問題時,我發現本書的解決方案與我的不同。

問題是:

您將獲得兩個32位數字N和M,以及兩個位置i和j。 編寫一種方法,將N中i和j之間的所有位設置為等於M(例如,M成為位於i處並從j開始的N的子串)。 例:

Input: N = 10000000000, M = 10101, i = 2, j = 6
Output: N = 10001010100

解決方案是:

public static int updateBits2(int n, int m, int i, int j) {
    int max = ~0;
    int left =  max - ((1 << j) - 1);
    int right = (1 << i) - 1;
    int mask = left | right;
    int maskN = mask & n;
    int result = maskN | (m << i);
    return result;
}

關鍵是要創建一個掩碼,以將i到n的j的位設置為0,然后將m左移到i的位置,然后將m和n進行或運算。

當輸入為n = 89,m = 3,i = 2,j = 4時,對於以下情況,答案應該為77:

n = 1011001
m = 011
n with 2 to 4 set by m = 1001101 = 77 

但解決方案的結果是93。

然后我發現解決方案創建的掩碼在左側缺少一個0位。 例如,對於上面給定的輸入,掩碼應為1100011。 但是該解決方案創建的掩碼是1110011。

我通過更改此行來解決此問題

int left =  max - ((1 << j) - 1);

int left =  max - ((1 << j + 1) - 1);

所以我的問題是,解決方案有誤還是我錯過了什么?

通過示例可以看出,在更改i = 2,j = 6和5位的情況下,[i,j]的范圍是一個包含范圍。 因此,如果您有i = 2和j = 4,則應設置3位,而不是2位。

因此,您發布的名為updateBits2的函數(我無法updateBits2是您的還是引用的函數)不正確。

但是,當j==31時,您的修復將失敗,這是他們會在編碼面試中使您煩惱的東西。 代替(1<<(j+1))-1 ,使用(1<<j)|((1<<j)-1) ,或將整行縮短到left = -2<<j;

我遇到了同樣的問題。 我認為解決方案是錯誤的。

int left =  max - ((1 << j) - 1);

應改為:

int left =  max - ((1 << j + 1) - 1); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM