题目:
小易有一个长度为n序列,小易想移除掉里面的重复元素,但是小易想是对于每种元素保留最后出现的那个。小易遇到了困难,希望你来帮助他。
输入描述:输入包括两行:
第一行为序列长度n(1 ≤ n ≤ 50)
第二行为n个数sequence[i](1 ≤ sequence[i] ≤ 1000),以空格分隔
输出描述:输出消除重复元素之后的序列,以空格分隔,行末无空格
输入例子:
9
100 100 100 99 99 99 100 100 100
输出例子:
99 100
当题主拿到这题的时候,觉得,嗯,这个题目不难,放在第一题很正常,也很有思路,刷刷刷地在eclipse里面码了起来,但我一开始是用HashSet的方法编的,样例的输入输出是对的,但是复制到Web调试框里,不管怎么调试都是不通过,百思不得其解后,因为考试时间有限,就先用了别人的代码。因为不服气,隔天揣摩了一下,一定要自己的代码能通过,于是发现了原因。
HasSet里是不允许出现相同的元素,但是HasSet底层是会自动按升序排列元素的,而题设要求保留相同元素最后出现的那个,所以这里就矛盾了,用HashSet方法显然是行不通的,而且不能确定元素的加入顺序,所以还是乖乖地用ArrayList方法吧。
代码如下:
需要注意的是:因为集合是倒序加入元素的, 所以在输出的时候要将集合中的元素再倒序输出,才能保证输出的是最后相同的元素,关键就这点,还是要逻辑清晰才行,题目还是不难的,关键要明确思路。
import java.util.*; public class Main { public static void main(String[] args) { Scanner scan=new Scanner(System.in); while(scan.hasNextLine()) { String num=scan.nextLine(); String str=scan.nextLine(); find(str); } } public static void find(String str) { String[] ch=str.split(" "); List<String> list=new ArrayList<String>(); /*从最后取元素加入集合, 这样才能保证是把最后相同的元素留下, 为后面倒序输出做铺垫 */ for(int i=ch.length-1;i>=0;i--) { if(!list.contains(ch[i])) list.add(ch[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)); } } }