![](/img/trans.png)
[英]Design the interaction between classes - regarding the Solution 8.7 of Cracking the Coding Interview
[英]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.