计蒜客---排序后的数组删除重复数字
这道题卡了好久,因为集合的remove方法没有掌握好的原因.第一在循环中使用remove需要谨慎.第二在迭代中使用remove也需要谨慎,下面介绍两种错误方法.
错误一:
ArrayList arr = new ArrayList();
for(int i = 10;i<15;i++)
arr.add(i);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(11);
System.out.println("删除前:"+arr.size());
for(int i = 0;i if(10 == arr.get(i))
arr.remove(i);
System.out.println("删除后:"+arr.size());
仔细看下执行结果:
删除前:10
删除后:7
arraylist进行remove操作会产生上面两种情况呢?
原因是每次remove后的size都会发生变化,但是迭代基数没有根据remove后的size动态调整,导致越界及集合遍历不完全。
正确方法如下:
ArrayList arr = new ArrayList();
for(int i = 10;i<15;i++)
arr.add(i);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(10);
arr.add(11);
System.out.println("删除前:"+arr.size());
for(int i = 0;i
if(10 == arr.get(i)){
arr.remove(i);
i--;
}
}
System.out.println("删除后:"+arr.size());
错误二:
迭代器中不能使用list的remove方法,要使用迭代器的remove方法.
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
start = (int)it.next();
for (Integer integer : list) {
if(start == integer){
count++;
}
}
for (int i = 2; i < count; i++) {
list.remove(start);
}
}
解题代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
/*
* 题目给的提示是双指针扫描,但是java没有指针,我就用集合了
*
*/
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
List<Integer> list = new ArrayList<Integer>();
int num,temp,start,count=0;
num = input.nextInt();
//初始化数组
for (int i = 0; i < num; i++) {
temp = input.nextInt();
list.add(temp);
}
start = list.get(0);
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
temp = it.next();
if(start == temp){
count++;
if(count>2){
count = count - 1;
it.remove();
}
}
else{
start = temp;
count = 1;
}
}
System.out.println(list.size());
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。