Question
小易有一个长度为n序列,小易想移除掉里面的重复元素,但是小易想是对于每种元素保留最后出现的那个。小易遇到了困难,希望你来帮助他。
输入描述:
输入包括两行:
第一行为序列长度n(1 ≤ n ≤ 50)
第二行为n个数sequence[i](1 ≤ sequence[i] ≤ 1000),以空格分隔
输出描述:
输出消除重复元素之后的序列,以空格分隔,行末无空格
输入例子:
9
100 100 100 99 99 99 100 100 100
输出例子:
99 100
基本思想:
使用Scanner接收控制台输入
难点应该是要求中的对于每种元素保留最后出现的那个这一句:
像出现如下情况时:100 100 99 11 11 11,移除重复元素必然是:100 99 11
而若出现这种情况:100 100 100 99 99 99 100 100 100,为满足 对于每种元素保留最后出现的那个 这一要求,三个99前后都出现了100,这时只能保留99后面的100,即 99 100;
只需从后往前遍历给定的数组即可满足对于每种元素保留最后出现的那个这一要求,用一个ArrayList保存合并重复元素后的集合,每往前遍历一个元素先判断该元素是否已经存在集合中,不存在就添加到集合中。
遍历结束要将集合倒序输出,因为遍历的时候对目标数组的遍历是从后往前的,加入到集合的顺序也是从后往前的,而输出时应该从前往后输出。
java代码如下:
public class GetOffer4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
sc.nextLine();
String str = sc.nextLine();
String[] arr = str.split(" ");
int k = 0;
int[] newArr = new int[size];
for (String value : arr) {
newArr[k++] = Integer.valueOf(value);
}
ArrayList<Integer> list = new ArrayList<Integer>();
// 从后往前遍历,如果重复不添加,
for (int i = newArr.length - 1; i >= 0; i--) {
if (!list.contains(newArr[i])) {
list.add(newArr[i]);
}
}
// 倒序遍历集合
for (int i = list.size() - 1; i >= 0; i--) {
if (i == 0) {
System.out.print(list.get(i));
} else {
System.out.print(list.get(i) + " ");
}
}
}
}