繁体   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