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 '!';
}

Java基础(37)ArrayList的remove方法的更多相关文章

  1. Java基础系列-ArrayList

    原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...

  2. Java基础关于Map(字典)的方法使用

    Java基础关于Map(字典)的方法使用 java中一般用map与hashmap来创建一个key-value对象 使用前提是要导入方法包: import java.util.HashMap: impo ...

  3. Java基础(44):ArrayList使用详解

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:    a.动态的增加和减少元素    b.实现了IColle ...

  4. ArrayList调用remove方法需要注意的地方

    ArrayList中有remove 方法和 removeAll方法, ArrayList中不仅继承了接口Collection中的remove方法,而且还扩展了remove方法. Collection中 ...

  5. JAVA基础——集合——ArrayList

    ArrayList集合 ArrayList的一些方法(JDK1.8): 将指定的元素附加到列表的末尾,true:添加成功,false:添加失败: public boolean add(E e)    ...

  6. 【java基础 13】两种方法判断hashmap中是否形成环形链表

    导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写.两种方法,一种是丢手绢法,另外一种,是迷路法. 这两种方法 ...

  7. Java基础系列--03_Java中的方法描述

    方法 (1)方法的定义:就是完成特定功能的代码块. 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法. (2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2 ...

  8. java ArrayList的remove()方法的参数为int和Integer的问题

    ArrayList的父类List中,有2个remove重载方法: remove(int index) remove(Object o) 假如参数输入为数字类型,到底是删除值等于该数字的对象还是删除索引 ...

  9. Java基础系列--ArrayList集合

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...

随机推荐

  1. 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探

    本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...

  2. 痞子衡嵌入式:MCUBootUtility v2.0来袭,i.MXRT1010哪里逃

    -- 恩智浦半导体从2017年10月开始正式推出业内首款跨界处理器-i.MX RT系列,如今距离该系列第一款i.MXRT1050发布已过去近2年,i.MX RT系列在行业里应用越来越广泛,i.MX R ...

  3. Spring boot 官网学习笔记 - Spring DevTools 介绍

    想要使用devtools支持,只需使用dependencies将模块依赖关系添加到你的构建中 运行打包的应用程序时,开发人员工具会自动禁用.如果你通过 java -jar或者其他特殊的类加载器进行启动 ...

  4. Ajax async属性

    async: 默认是true:异步,false:同步. 其他属性扩展: 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数, ...

  5. Flask基础(01)-->Flask框架介绍

    什么是Flask? 说白了,Flask就是一种web框架 在python中常用的框架有 flask django tornado 什么又是web框架呢?  为什么要使用web框架呢? 增强扩展性和稳定 ...

  6. volatile 关键字的作用

    简介Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程.volatile 变量具备两种特性:变量可见性.禁止重排序. 作为同步锁在访问 vola ...

  7. 利用threading模块开线程

    一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...

  8. 无广告版本Flash player 一枚,需要的拿走~

    无广告版本flashplayer,国内flashplayer已经被植入了广告,安装后不断的弹出广告使用体验很差,最开始还以为是电脑被恶意植入捆绑插件, 检查半天发现竟然是浏览器的flash playe ...

  9. java架构之路-(面试篇)JVM虚拟机面试大全

    下文连接比较多啊,都是我过整理的博客,很多答案都在博客里有详细说明,理解记忆是最扎实的记忆.而且我的答案不一定是最准确的,但是我的答案不会让你失望,而且几乎每个答案都是问题的扩展答案. 1.JVM内存 ...

  10. 关于CSS的书写规范和顺序

    关于CSS的书写规范和顺序,是大部分前端er都必须要攻克的一门关卡,如果没有按照良好的CSS书写规范来写CSS代码,会影响代码的阅读体验.这里总结了一个CSS书写规范.CSS书写顺序供大家参考,这些是 ...