SIZE(n) 其中 n = arr.size,保留顺序:
创建一个与需要从中删除 0 的初始数组大小相同的数组。迭代原始数组,并将每个不为 0 的元素添加到新数组中。当遇到 0 时,计算它。现在,当到达第一个数组的末尾时,只需将计算出的 0 数量添加到数组的末尾即可。而且,更简单的是,由于 Java 将数组初始化为 0,因此您可以忘记在末尾添加零。
Edit
由于您添加了无法创建新数组的额外约束,因此我们需要采取与我上面建议的方法略有不同的方法。
SIZE(1)
我假设数组需要保持与 0 移动到末尾之前相同的顺序。如果不是这种情况,则有另一个简单的解决方案,如 Brads 答案中详述:将“最后一个零”索引初始化为数组的最后一个元素,然后向后迭代,将任何零与每次递减的最后一个零的索引交换您执行交换或看到零。
SIZE(1),保留顺序:
要将 0 移动到末尾而不复制数组并使元素保持正确的顺序,您可以完全按照我的建议进行操作,而无需复制数组,但在同一数组上保留两个索引。
从数组的两个索引开始。如果元素不为零,则不要将其复制到新数组,而是将其保留在原来的位置并增加两个索引。当达到零时,仅增加一个索引。现在,如果两个索引不相同,并且您查看的不是 0,则将当前元素交换到落后的索引位置(由于遇到 0)。在这两种情况下,如果当前元素不为 0,则增加另一个索引。
它看起来像这样:
int max = arr.length;
for (int i = 0, int j = 0; j < max; j++) {
if (arr[j] != 0) {
if (i < j) {
swap(arr, i, j);
}
i++
}
}
运行此:
{ 1, 2, 0, 0, 0, 3, 4, 0, 5, 0 }
yeilds:
{ 1, 2, 3, 4, 5, 0, 0, 0, 0, 0 }
我制造了一个完全工作版本对于任何好奇的人。