Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 5.1中破解编码面试的解决方案是否错误?_Java_Algorithm - Fatal编程技术网

Java 5.1中破解编码面试的解决方案是否错误?

Java 5.1中破解编码面试的解决方案是否错误?,java,algorithm,Java,Algorithm,因为我有一个即将到来的技术面试,我最近开始学习《破解编码面试》一书 当我练习5.1的问题时,我发现这本书的答案与我的不同 问题是: 您将获得两个32位数字N和M,以及两个位位置i和j。 编写一种方法,将N中i和j之间的所有位设置为M(例如,M成为位于i处且从j开始的N的子串)。 例如: 解决办法是: public static int updateBits2(int n, int m, int i, int j) { int max = ~0; int left = max -

因为我有一个即将到来的技术面试,我最近开始学习《破解编码面试》一书

当我练习5.1的问题时,我发现这本书的答案与我的不同

问题是:

您将获得两个32位数字N和M,以及两个位位置i和j。
编写一种方法,将N中i和j之间的所有位设置为M(例如,M成为位于i处且从j开始的N的子串)。 例如:

解决办法是:

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;
}
但解决方案的结果是93

然后我发现解决方案创建的掩码缺少一个0位 在左边。 例如,对于上述给定输入,掩码应为1100011。 但该解决方案创建的掩码是1110011

我通过改变这条线来解决这个问题

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

int left=max-((1您可以通过示例判断,其中i=2、j=6和5位被更改,[i,j]意味着是一个包含范围。因此,如果i=2和j=4,您应该设置3位,而不是2位

因此,您发布的名为
updateBits2
的函数(我不知道它是您的还是引用的)不正确


但是,当
j==31
时,您的修复会失败,这是他们在编码访谈中可能会让您感到困扰的问题。您可以通过示例判断[i,j]是一个包含范围,而不是
(1),其中i=2、j=6和5位发生了更改。因此,如果您有i=2和j=4,您应该设置3位,而不是2位

因此,您发布的名为
updateBits2
的函数(我不知道它是您的还是引用的)不正确


但是,当
j==31
时,您的修复会失败,这是他们在编码面试中会让您感到困扰的问题。我遇到的不是
(1),而是同样的问题。我认为解决方案是错误的

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

int left=max-((1我遇到了同样的问题。我认为解决方案是错误的

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

int left=max-((1)语言是java.Wani,您完全正确。解决方案是错误的。“位于i,从j开始”--您的意思是从
j
th位开始,以
i
th位结束?不,它的意思是从
i
th开始,以
j
th结束。语言是java.Wani,您完全正确。解决方案是错误的。“位于i,从j开始”--你的意思是从
j
th位开始,然后在
i
th位结束?不,它的意思是从
i
th位开始,然后在
j
th位结束。谢谢你的精彩回答!函数
updateBits 2
在书中被命名为
updateBits
,我为测试更改了它的名称,但内容保持不变。谢谢你或者是一个精彩的答案!函数
updateBits2
在书中被命名为
updateBits
,我为测试更改了它的名称,但内容保持不变。
int left =  max - ((1 << j + 1) - 1);
int left =  max - ((1 << j) - 1);
int left =  max - ((1 << j + 1) - 1);