zoukankan      html  css  js  c++  java
  • 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 '!';
        }
  • 相关阅读:
    JQuery缓冲加载图片插件lazyload.js的使用方法
    CSS3阴影 box-shadow的使用和技巧总结
    HTML符号大全
    TouchSlide
    响应式图片的3种解决方案
    ECMAScript arguments 对象
    call() 方法 和 apply()方法详解
    字体图标 iconfont cssfont
    响应式样式
    1-微信小程序创建项目
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/9517677.html
Copyright © 2011-2022 走看看