将int 0的所有元素移到ArrayList的后面?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将int 0的所有元素移到ArrayList的后面?相关的知识,希望对你有一定的参考价值。
我正在创建一个方法,将0的所有实例移到ArrayList的最后,但保留其他数字的原始顺序。
public static ArrayList<Integer>
zerosBack(ArrayList<Integer> arr)
{
for(int i = 0; i < arr.size(); i++){
if(arr.get(i) == 0){
arr.remove(i);
arr.add(0);
}
}
return arr;
}
这个方法似乎对所有的输入都有效,除了这个。[4, 0, 0, 0, 0, 0]
我的程序输出: [0,0,4,0,0,0] 而不是[4,0,0,0,0,0]。
答案
一般来说,最好的办法是从最后迭代一个ArrayList,并在删除元素时移动到前面。这样可以消除从列表前部到列表尾部时发生的索引错误。例如,下面的代码应该可以工作。
public static ArrayList<Integer> zerosBack(ArrayList<Integer> arr) {
for (int i = arr.size()-1; i>=0; i--) {
if (arr.get(i) == 0) {
arr.remove(i);
arr.add(0);
}
}
return arr;
}
另一答案
你可以跟踪原来的大小,然后删除所有的零,然后用原来的大小和当前的大小一次性地把它们加回来。
public static List<Integer> zerosBack(List<Integer> arr) {
int count = arr.size();
arr.removeIf(v -> v == 0);
if (count != arr.size()) {
arr.addAll(Collections.nCopies(count - arr.size(), 0));
}
return arr;
}
另一答案
如果你想要更多的时间和空间效率的代码,而且元素的排序并不重要。
static ArrayList<Integer> zerosBack(ArrayList<Integer> arr) {
int firstCounter = 0;
int lastCounter = arr.size() - 1;
while (lastCounter > firstCounter) {
if (0 == arr.get(lastCounter)) {
lastCounter--;
continue;
}
if (0 != arr.get(firstCounter)) {
firstCounter++;
continue;
}
arr.set(firstCounter, arr.get(lastCounter));
arr.set(lastCounter, 0);
}
return arr;
}
以上是关于将int 0的所有元素移到ArrayList的后面?的主要内容,如果未能解决你的问题,请参考以下文章