先来看看题目
输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符。例如,输入“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去重这方面进行靠拢!!!
今天的讲解就到此结束,我们下期再见!!!
下期再见,各位老铁!!!