Java基础(37)ArrayList的remove方法
1.问题描述
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
输入: s = "abcd" t = "abcde" 输出: e 解释: 'e' 是那个被添加的字母。
2.解题思路
更好的方法是使用之前提到过的按位异或操作。
这里的想法是:在list_t这个列表里删除在list_s列表中包含的元素,剩下的那个元素就是要求得的被添加的字母。
List<Character> list_t = new ArrayList<>(); for (char c : t.toCharArray()) { list_t.add(c); } List<Character> list_s = new ArrayList<>(); for (char c : s.toCharArray()) { list_s.add(c); }
3.当s=“abcd”,t=“abcde”的这种情况
for (int i = 0; i < list_t.size(); i++) { if (list_s.contains(list_t.get(i))) { list_t.remove(i); } } for (Iterator<Character> iterator = list_t.iterator(); iterator.hasNext();) { Character character = (Character) iterator.next(); System.out.println(character); } return list_t.get(0);
使用上面的代码,当s=“abcd”,t=“abcde”时,执行第一个for循环后,遍历list_t得到的结果为:b d e也就是说只删除了a c。
这是因为当i=0使,删除了a,然后bcde都向前移了一位,b的索引下标变成了0,size()变成了4,
当i=1时,访问的其实是c,删除了c之后,de向前移动,list中有元素b d e,size()变成了3,
当i=2时,访问的其实是e,return的结果是b。
(1)解决办法1:在每次remove之后都i--;
for (int i = 0; i < list_t.size(); i++) { if (list_s.contains(list_t.get(i))) { list_t.remove(i); i--; } }
(2)解决办法2:倒过来遍历list,也可以
for (int i = list_t.size() - 1; i >= 0; i--) { if (list_s.contains(list_t.get(i))) { list_t.remove(i); } }
(3)解决办法3:使用迭代器的remove方法
Iterator<Character> it = list_t.iterator(); while (it.hasNext()) { Character next = (Character) it.next(); if (list_s.contains(next)) { it.remove(); } }
4..当s=“a”,t=“aa”的这种情况,期待输出:a,但是上面的三种情况均报错
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) at easy.e389.findTheDifference(e389.java:47) at easy.e389.main(e389.java:53)
这是因为,不管使用上面的哪种方法,最后list_t中的元素都为空,因此在list_t.size()==0的情况下return list_t.get(0)就会报错。
所以说,这种思路是有问题的,如果想按照这种方法做的话,就必须要使用HashMap,统计相同的字符在各个map中出现的次数,同时,另外一个中包含就让次数减1,最后得到出现次数value等于1对应的键key就是要得到的结果。
5.使用HashMap的代码
HashMap<Character, Integer> count = new HashMap<>(); for (char c : t.toCharArray()) { count.put(c, count.getOrDefault(c, 0) + 1); } for (char c : s.toCharArray()) { count.put(c, count.get(c) - 1); } for (char c : count.keySet()) { if (count.get(c) == 1) { return c; } } return '!'; }