我目前只能从事一项作业,不知道我是否弄错了指令,或者代码是否正确。说明是: 将第一个元素和最后一个元素之外的每个元素替换为两个元素中较大的一个。
我已经完成了代码,但是我遇到的一个问题是即使不应该替换最后一个元素。如果您能看一下我的代码,那就太好了。
public static void replaceWithNeighbours(int[] array) {
for (int i = 1; i < array.length - 1; i++) {
int larger = array[i - 1];
if (larger < array[i + 1]) {
larger = array[i + 1];
}
array[i] = larger;
}
}
答案 0 :(得分:0)
一个幼稚的解决方案,可以更好地完成阵列管理,但是可以。
public static void replaceWithNeighbours(int[] array, int[] out) throws Exception
{
// checkif lengths match
if (array.length != out.length)
{
throw new Exception("Lengths don't match");
}
// replace values in output array
out[0] = array[0];
out[out.length - 1] = array[array.length - 1];
for (int i = 1; i < array.length - 1; i++) {
int larger = array[i - 1];
if (larger < array[i + 1]) {
larger = array[i + 1];
}
out[i] = larger;
}
}
您的主要问题是遍历数组并更新它,但是不考虑以前的迭代。这意味着您可以查看已经拥有更新值的邻居并使用该值,因为旧值已被覆盖。
由于最后一个元素也有更新问题,
使用调试器或简单的打印语句遍历代码,并找出实际访问索引9的确切位置。它不在replaceWithNeighbours
中,因此必须在其他地方。但是,您可以自己解决此问题,只需查看使用了哪些索引,并在看到9时查找输入的内容和位置。
答案 1 :(得分:0)
这可以通过简单的方式完成:
public int[] replaceWithNeighbours(int[] arr) {
int[] ret = new int[arr.length];
for (int i = 0; i < arr.length; ++i) {
if (i == 0 || i == arr.length - 1) {
ret[i] = arr[i];
} else {
ret[i] = Math.max(arr[i-1], arr[i+1]);
}
}
return ret;
}
简短说明:首先,我们创建一个新数组ret
,它将保存所需的结果并将其设置为与原始数组相同的长度。然后我们遍历原始数组的内容。如果要处理第一个或最后一个元素,则只需将它们复制到ret
。如果要处理其他元素,则使用Java的Math.max
方法确定2个邻居的最大值,并将ret
中的第i个元素设置为该值。