我的任务:输入是一维数组。必须找到最大宽度的范围,该范围的元素为正(大于0)。 作为响应,应该有2个元素组成的数组,其中: -元素编号0-段左边界的索引元素; -元素№1-段右边界元素的索引。
如果有多个这样的段,则返回RIGHT。如果数组中没有这样的段(所有数字均为负),则返回一个空数组。 我不明白我做错了什么。有我的代码:
public class ArrayUtils {
public static int[] lookFor(int[] array) {
int[] result = new int[2];
int firstIndex = 0;
int lastIndex = 0;
int sequenceLength = 0;
int currentSequenceLength = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] > 0) {
if ( currentSequenceLength == 0 ) {
firstIndex = i;
}
currentSequenceLength += 1;
lastIndex = i;
} else {
if (currentSequenceLength > sequenceLength) {
sequenceLength = currentSequenceLength;
result[0] = firstIndex;
result[1] = lastIndex;
}
currentSequenceLength = 0;
}
}
if (sequenceLength == 0) {
return new int[0];
}
return result;
}
}
答案 0 :(得分:1)
我看到两个问题:
if there are several such segments, return the RIGHT
-这意味着即使长度相同,也应将前一个最长的序列替换为当前的最长序列。即if (currentSequenceLength > sequenceLength)
应该是if (currentSequenceLength >= sequenceLength)
。
您将忽略任何以数组的最后一个索引结尾的序列。您应该在循环后通过添加以下内容来处理它:
if (currentSequenceLength >= sequenceLength) {
sequenceLength = currentSequenceLength;
result[0] = firstIndex;
result[1] = lastIndex;
}
总而言之,您的方法应如下所示:
public static int[] lookFor(int[] array) {
int[] result = new int[2];
int firstIndex = 0;
int lastIndex = 0;
int sequenceLength = 0;
int currentSequenceLength = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] > 0) {
if ( currentSequenceLength == 0 ) {
firstIndex = i;
}
currentSequenceLength += 1;
lastIndex = i;
} else {
if (currentSequenceLength >= sequenceLength) {
sequenceLength = currentSequenceLength;
result[0] = firstIndex;
result[1] = lastIndex;
}
currentSequenceLength = 0;
}
}
if (currentSequenceLength >= sequenceLength) {
sequenceLength = currentSequenceLength;
result[0] = firstIndex;
result[1] = lastIndex;
}
if (sequenceLength == 0) {
return new int[0];
}
return result;
}