Java基础(37)ArrayList的remove方法

  1.问题描述

  给定两个字符串 st,它们只包含小写字母。

  字符串 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 '!';
    }
原文地址:https://www.cnblogs.com/BigJunOba/p/9517677.html