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. Spring 梳理 - @Component

    使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符.如果不指定标识符,默认为首字母小写类名.例如类UserController的标识 ...

  2. windows下配置多个tomcat步骤

    步骤如下: 1.使用压缩版的tomcat不能使用安装版的.2.第一个tomcat的配置不变.3.增加环境变量CATALINA_HOME2,值为新的tomcat的地址:增加环境变量CATALINA_BA ...

  3. POJ 2533——Longest Ordered Subsequence(DP)

    链接:http://poj.org/problem?id=2533 题解 #include<iostream> using namespace std; ]; //存放数列 ]; //b[ ...

  4. 一个随意list引发的惨案(java到底是值传递还是引用 传递?)

    前两天写了一个递归,因为太年轻,把一个递归方法需要用到的list定义该递归方法外了,结果开始断点测试的时候有点小问题 ,然后上线之后因为数据量太多导致了一个java.util.ConcurrentMo ...

  5. Java通过JDK动态代理简单的实现一个AOP

    首先说一下,因为自己还没有去研读spring的AOP的源码,只是大致知道其功能,便想着自己先手动实现一个先看看,觉得这样以后研读源码的时候会收获更多! 实现:做一个在添加注解的方法执行之前,可以先执行 ...

  6. Windows下IIS搭建Ftp服务器

    第一步:启用Windows IIS Web服务器 1.1 控制面板中找到"程序"并打开 1.2 程序界面找到"启用或关闭Windows功能"并打开 1.3 上面 ...

  7. 阿里云服务器ecs + tomcat + 域名解析 部署web页面

    1.购买ecs:https://www.aliyun.com/product/ecs?spm=5176.12825654.eofdhaal5.2.3bf92c4aYOB7gL&aly_as=A ...

  8. Java11月9日的动手动脑

    Java动手动脑 请自行编写代码测试以下特性(动手动脑): 在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 程序源代码: package yanzhengjicheng; class ...

  9. 【NOIP2011】选择客栈

    题文: 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从1 到n 编号.每家客栈都按照某一种色调进行装饰(总共k 种,用整数0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的 ...

  10. 【bzoj2342】[Shoi2011]双倍回文

    这题属于博主还未填坑系列,先嘴巴AC,到时候有时间再搞字符串时,再来好好填坑. 废话不多说上题: 题解: 显然是和马拉车有关的吧,我们可以先对整个串跑一个马拉车,然后枚举‘#’好字符,并以他为中心,在 ...