【发布时间】:2021-09-05 21:50:30
【问题描述】:
public static void remove (int[] arr, int toRemove)
“它应该从数组中删除 toRemove 的值。剩余的元素应该只是移向数组的开头。(数组的大小不会改变)。由于数组现在使用的元素减少了,原来的最后一个元素应该只替换为 0。如果数组中出现多个 toRemove,则只删除第一个出现。如果数组没有元素,它应该没有任何效果。
到目前为止,我有这个:
public static void remove(int[] arr, int toRemove) {
for(int i = 0; i <= arr.length - 1; i++) {
if(arr[i] == toRemove) {
arr[i] = arr[i + 1];
arr[toRemove] = 0;
}
}
}
我有一个包含其内容的数组的 main 方法:[3, 5, 7, 8, 12, 2] 和一个调用 remove(array, 5)。但是,我的数组打印出[3, 7, 7, 8, 12, 0],而它应该打印出[3, 7, 8, 12, 2, 0]。
谁能告诉我我的错误并解释一下?
【问题讨论】:
-
所以您的代码发现 arr[1] 为 5,将其设置为 arr[2],即 7,然后由于某种原因您将 arr[5] 设置为零。您不会移动任何其他元素。
-
两件事-您将
toRemove元素的索引替换为0,而不是实际的最后一个元素,因此在您的情况下,您将删除arr[5](在这种情况恰好是最后一个元素),并且您没有考虑多次出现toRemove。 -
使用调试器单步调试代码
-
@ManishGiri 我只应该删除第一次出现然后程序结束。而且由于它是一个循环,这是否意味着它将所有当前索引设置为向左移动的下一个索引(i + 1)?我相信我仍然不了解如何转移所有其他元素。
-
如果数组中有很多倍的值
toRemove怎么办?