【发布时间】:2017-01-31 20:27:50
【问题描述】:
此方法的作用是从数组中删除值 toRemove。剩余的元素应该只是移向数组的开头。 (数组的大小不会改变。)由于数组现在将少一个元素,所以最后一个元素的位置应该用 0 填充。如果数组中出现多个 toRemove,则应该只出现第一个元素被移除。该方法没有返回值,如果数组没有元素,它应该没有任何效果。
解决办法:
public static void remove(int[] arr, int toRemove) {
boolean done = false;
int position = 0;
for(int pos = 0; pos < arr.length; pos++) {
if(!done && arr[pos] == toRemove) {
done = true;
position = pos;
}
if(done) {
for(int i = position + 1; i < arr.length; i++) {
arr[i - 1] = arr[i];
}
arr[arr.length -1] = 0;
}
}
}
我没有关注这个算法的工作原理。 boolean 的使用让我感到困惑,我觉得我不完全理解原始数据类型的作用,我知道它包含两个东西,要么是真要么是假,默认情况下是假的。但这究竟意味着什么?我不明白布尔值。 我理解为什么需要一个 int 占位符作为找到 toRemove 值的索引。我知道我们希望使用一个 for 循环来逐一迭代索引及其各自的值,并查明找到 toRemove 的确切位置。我知道我们需要一个有条件的检查点来查看在某个任意索引处是否存在 toRemove 值,因此:
if(arr[pos] = toRemove) // then bingo we've found him
我不明白布尔值!完成,布尔值让我感到困惑。 为什么在这个检查点之后有done = true?然后再检查一次是否(完成)?以及为什么另一个 for 循环 for(int i = position + 1; i
我知道当我们想要访问一个特定的索引值时,我们会编写 variablenameOfArr 然后 [] 并将其放入框内。我很难把这一切放在一起。
谢谢
【问题讨论】:
-
您确定此代码仅删除第一次出现的值吗?在我看来,如果该值出现不止一次,它将删除多个元素(在第一个元素之后,不一定是匹配的元素之后)。也许
if(done)块末尾缺少return;语句? -
if(arr[pos] = toRemove)小心:这不是代码所说的,这也是无效的(这是一个赋值,而不是比较)。 -
我刚刚编辑了代码以更正缩进。之前很纠结。正确的缩进可以帮助你更好地理解代码。
-
你测试过这个方法吗?没看过,只是看了一下,觉得不太对。如果找到该值,则会将其删除,但随后会将剩余值移动太多次。