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. 构建之法——homework4

    手机应用——软件腾讯QQ: QQ是腾讯公司开发的一款基于Internet的即时通信软件.最初通过在线广告进行盈利(Banner广告.Email广告等).然后通过免费注册QQ,获取大量用户.开发QQ相关 ...

  2. 商用hadoop集群的配置命令分布

    角色 安装 hdfs配置 yarn配置 hdfs 格式化 启动yarn服务 启动hdfs服务 master yum install hadoop-hdfs-namenode yum install h ...

  3. 【转】ICMP协议

    1.ICMP出现的原因 在IP通信中,经常有数据包到达不了对方的情况.原因是,在通信途中的某处的一个路由器由于不能处理所有的数据包,就将数据包一个一个丢弃了.或者,虽然到达了对方,但是由于搞错了端口号 ...

  4. 后端开发实践系列之四——简单可用的CQRS编码实践

    本文只讲了一件事情:软件模型中存在读模型和写模型之分,CQRS便为此而生. 20多年前,Bertrand Meyer在他的<Object-Oriented Software Constructi ...

  5. spring boot项目下application.properties中使用logging.path和logging.file时的细节

    logging.path仅仅用于指定日志输出的目录,且不能指定输出的文件名,且默认名为spring.log  若指定的是相对目录,则会生成在当前总项目的目录下 idea中新建sprnig boot项目 ...

  6. HTML5 + WebGL 实现的垃圾分类系统

    前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私 ...

  7. Cocos Creator实现左右跳游戏,提供完整游戏代码工程

    ​1. 玩法说明 游戏开始后,点击屏幕左右两侧,机器人朝左上方或右上方跳一步,如果下一步有石块,成功得1分,否则游戏结束. 2. 模块介绍 游戏场景分为2个:主页场景(home).游戏场景(game) ...

  8. 自己写的Weblogic的poc

    """ 暂时只试用于Linux,先试试用一下反弹shell CVE-2017-10271的EXp """ import requests i ...

  9. Cocos Creator 通用框架设计 —— 资源管理

    如果你想使用Cocos Creator制作一些规模稍大的游戏,那么资源管理是必须解决的问题,随着游戏的进行,你可能会发现游戏的内存占用只升不降,哪怕你当前只用到了极少的资源,并且有使用cc.loade ...

  10. 搭建YUM本地仓库

    本文介绍如何利用CentOS 7 ISO光盘镜像搭建YUM本地仓库. 环境准备: (1)VMware15.5版本虚拟机 (2)CentOS-7-x86_64-DVD-1908光盘镜像文件 1. 搭建Y ...