我试图编写一个代码,在从索引0扫描的整数ArrayList中的第一个非零元素之前删除所有零.但是,代码继续删除固定的no.在第一个非零元素之后的零.任何人都可以找出原因吗?(对不起,如果发布的问题格式不理想.这是我的第一次.)对于下面的代码,预期的输出是[2 0 0 0 0 0],但收到的输出是[2 0 0]
class Zeroeliminator {
public static void main(String args[]) {
ArrayList < Integer > arr = new ArrayList < Integer > ();
arr.add(0); // A
arr.add(2);
for (int i = 2; i < 7; i++)
arr.add(0);
System.out.println(arr.size());
for (int i = 0; i < arr.size(); i++) {
if (arr.get(i) != 0) {
break;
}
System.out.println(arr.get(i));
arr.remove(i);
}
System.out.println(arr.size());
ListIterator < Integer > itr = arr.listIterator(0);
while (itr.hasNext()) {
System.out.print(itr.next() + " ");
}
System.out.println();
}
}
Run Code Online (Sandbox Code Playgroud)
您的代码的问题在于,当您删除元素时,其后面的所有元素都会向下移动一个元素.所以,一次迭代的状态如下所示:
arr=[0 2 0 0], i = 0
// Remove element i
arr=[2 0 0], i = 0
// Increment i
arr=[2 0 0], i = 1
Run Code Online (Sandbox Code Playgroud)
在下一次迭代中,你将检查i = 1,并忽略那里有2的事实,因为你从未读过它的值.
您可以通过i每次删除元素时递减来解决此问题.但是你根本不需要i,因为你要删除列表前缀.相反,你可以使用:
while (!arr.isEmpty() && list.get(0) == 0) {
arr.remove(0);
}
Run Code Online (Sandbox Code Playgroud)
更好(更有效)的方法是首先扫描列表以找到第一个非零元素,然后一次删除前面的元素:
int i = 0;
while (i < arr.size() && arr.get(i) == 0) {
i++;
}
arr.subList(0, i).clear();
Run Code Online (Sandbox Code Playgroud)
从ArrayList的前面删除1个元素是O(大小),因为所有其他元素必须向下移动一个; 所以删除多个元素是O(#removed*size).
使用子列表的方法一次完成所有的移位,因此它是O(大小).
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |