[英]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.