我在整数的二进制表示中找到最长的零序列,但在 app.codility.com 上结果不正确,其中 n = 6 和 n =328
公共(public) int 解决方案(int N){
Integer result = 1;
StringBuilder modNumber = new StringBuilder();
while (result > 0) {
result = n / 2;
modNumber.append(n % 2 + "");
n = result;
}
int length = modNumber.length();
String modString = modNumber.toString();
Integer binaryGap = 0;
List<Integer> lstResult = new ArrayList<>();
Boolean isBinaryGap = false;
if (modString.charAt(0) == '0') {
binaryGap = 0;
} else {
for (int i = 1; i < length; i++) {
char c = modString.charAt(i);
if (c == '0') {
binaryGap += 1;
isBinaryGap = true;
} else {
isBinaryGap = false;
}
if(!isBinaryGap) {
lstResult.add(binaryGap);
binaryGap = 0;
}
}
}
int max=0;
if(!lstResult.isEmpty()) {
max = lstResult.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();
}
return max;
}
最佳答案
问题出在这部分:
if (modString.charAt(0) == '0') {
binaryGap = 0;
} else {
我怀疑你的意图是处理输入为零的情况(那么为什么不立即使用 N
的原始值来处理呢?),但是你会得到很多误报因为形成字符串的技术将这些位按照从最低有效位到最高有效位的顺序排列。 每个偶数的最低有效位都是 0,因此您报告所有偶数的间隙为 0,但正确结果的唯一偶数是 0。
我确信,利用这些信息,您可以修复代码以产生正确的结果,但如果您选择更简单的方法,问题甚至不会出现。例如,只扫描一次二进制表示,并随时跟踪当前和最大间隙长度怎么样?您已经执行了所需的扫描,但不是直接计算结果,而是经历所有困惑的构建,然后分析字符串表示。代码越简单,出现错误的空间就越小,而且当错误出现时,通常更容易发现。
关于java - 为什么 BinaryGap 对于 Trailing_zeroes 不正确(n = 6 和 n = 328),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56050862/