先来看看题目
输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符。例如,输入“They are students.”和“aeiou”,则删除之后的第一个字符串变成“Thy r stdnts”。
思路:
这个题目使用Set来做,set具有去重的效果
遍历第二个没有重复元素的数组放到set中
再遍历第一个长的数组,和set的元素比较,如果相同就跳过,不相同,就放到拼接字符串中
然后搞一个StringBuffer对象,用于拼接符合条件的字符串
思路有了,我们来看一看代码
public class TestDemo {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String s1=in.nextLine();
String s2=in.nextLine();
Set<Character> set=new HashSet<>();
StringBuffer stringBuffer=new StringBuffer();//拼接字符串
for(int i=0;i<s2.length();i++) {
char ch = s2.charAt(i);
set.add(ch);
}
for(int j=0;j<s1.length();j++){
char ch1=s1.charAt(j);
if(!set.contains(ch1)){
stringBuffer.append(ch1);
}
}
System.out.println(stringBuffer);
}
}
2.使用哈希映射思想
1.要创建一个大小为256的int类型的数组,每个值为0
2.然后遍历第二个数组,记录一下,出现了就++
3.遍历第一个数组,和map数组的元素对比,有的话跳过,没有就拼接到字符串上
画个图来理解一下
hash[str[i]]++
本来hash数组的每一个值为0,现在遍历一下第二个数组,当i=0时,str[i]=98,也就意味着在hash数组中找下标为98的下标,进行+1操作,如果本来就有,那就要在原来的结果上+1,没有的话就直接添加
然后遍历第一个数组,看看map数组有没有str1的值,没有就拼接到字符串上,最后进行打印
思路有了,我们来写代码
import java.util.HashMap;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String s1=scanner.nextLine();
String s2=scanner.nextLine();
HashMap<Character,Integer> hashMap=new HashMap<>();
//遍历第二个数组
for(int i=0;i<s2.length();i++){
if(hashMap.get(s2.charAt(i))==null){
hashMap.put(s2.charAt(i),1);
}else{
hashMap.put(s2.charAt(i),hashMap.get(s2.charAt(i))+1);
}
}
//遍历第一个数组
String ret="";
for(int i=0;i<s1.length();i++){
if(hashMap.get(s1.charAt(i))==null){
ret+=s1.charAt(i);
}
}
System.out.println(ret);
}
}
这两种不同的方法,第一种是采用set集合的去重,第二种是采用哈希映射
但是相同的地方在于遍历
以后再遇到这种删除公共字符类的题目,就向哈希数组或者set去重这方面进行靠拢!!!
今天的讲解就到此结束,我们下期再见!!!
下期再见,各位老铁!!!