Java 5.1中破解编码面试的解决方案是否错误?
因为我有一个即将到来的技术面试,我最近开始学习《破解编码面试》一书 当我练习5.1的问题时,我发现这本书的答案与我的不同 问题是: 您将获得两个32位数字N和M,以及两个位位置i和j。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 -
编写一种方法,将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);