目录
一、题干
二、题解
1. 思路
ArrayList实现
2. 代码
ArrayList实现
StringBuilder实现-1
StringBuilder实现-2
三、总结
一、题干
面试的编程题:
s1: "welcome to Zhejiang"
s2: "come"
要求输出从字符串s1删除s2中存在的字符之后的结果。如运行后,输出:"wl t Zhjiang"
二、题解
1. 思路
ArrayList实现
这道题的思路并不复杂,要从s1中删除s2中存在的字符,只需要遍历字符串s1的每个字符,依次对比它是否在s2中出现。出现了的删去,没有出现的留下。如何运用集合类ArrayList进行实现呢?可能也不难想到,只需将s1中需要留下的字符存入顺序表即可。
在编写代码时,其中有一些细节需要我们注意:
- 由于是将需要留下的字符存入ArrayList中,因此在实例化ArrayList时,应当采取泛型类ArrayList<Character>:
ArrayList<Character> list = new ArrayList<>();
- 检查s2中是否包含s1的字符,调用字符串方法contains()即可。但要注意,若写作s2.contains(ch)是不正确的(ch是char类型)。因为contains()方法的参数类型为CharSequence,与char类型是不匹配的。
因此,每次使用字符串类的contains()方法前,必须要先将待查找的char字符转换成CharSequence类型。在本文文末补充了CharSequence相关的知识。 CharSequence实际上是一个接口,而String类就实现了这个接口。因此,通过ch+""或String.valueOf(ch)将char类型转换为String类型即可。
该方法的本质就是创建一个新的空间(可以是ArrayList类型,也可以是普通的char数组),也可以用StringBuilder类型实现。下面代码中的StringBuilder实现-1与StringBuilder实现-2即为对应的代码。
2. 代码
ArrayList实现
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Character> list = new ArrayList<>();
String s1 = "welcome to Zhejiang";
String s2 = "come";
for (int i = 0; i < s1.length(); i++) {
char ch = s1.charAt(i);
if(!s2.contains(String.valueOf(ch))) {
list.add(ch);
}
}
//System.out.println(list); 打印出的格式不符合要求
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
}
}
StringBuilder实现-1
public class Test {
public static void main(String[] args) {
String s1 = "welcome to Zhejiang";
String s2 = "come";
StringBuilder ret = new StringBuilder();
for (int i = 0; i < s1.length(); i++) {
char ch = s1.charAt(i);
if(!s2.contains(String.valueOf(ch))) {
ret.append(ch); //StringBuilder的追加方法
}
}
for (int i = 0; i < ret.length(); i++) {
System.out.print(ret.charAt(i));
}
}
}
StringBuilder实现-2
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Character> list = new ArrayList<>();
String s1 = "welcome to Zhejiang";
String s2 = "come";
StringBuilder stringBuilder = new StringBuilder(s1);
//创建一个内容与s1相同的stringbuilder类,该代码对它来说是原地的
for (int i = 0; i < stringBuilder.length(); i++) {
char ch = stringBuilder.charAt(i);
if(s2.contains(String.valueOf(ch))) {
stringBuilder.deleteCharAt(i);
i--;
}
}
System.out.println(stringBuilder);
}
}
三、总结
- 本题难度并不大,初学集合类或对集合类不太熟悉的同学可以浏览学习一下,从易到难了解Java集合类的各种方法以及相关应用。
- 本题的实现方法有很多,本文列举了用StringBuilder类实现的另两种方式,主要熟悉append()方法与deleteCharAt()方法的使用。
-
知识点补充:Interface CharSequence