作者简介:大家好,我是未央;
博客首页:未央.303
系列专栏:笔试强训编程题
每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!
文章目录
前言
一、组队竞赛100449
二、删除公共字符69390
题目描述:
题目解析:
总结
前言
今天我们将进入到编程题的训练当中,这里面的编程题大多数都是牛客的习题;编程题对我们以后的笔试环节有着很大的作用,所以必须熟练的掌握和运用;话不多说,让我们看看第一天的题目吧!!!!
一、组队竞赛100449
二、删除公共字符69390
题目描述:
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述:
每个测试输入包含2个字符串;
输出描述:
输出删除后的字符串;
示例:
牛客链接: https://www.nowcoder.com/practice/f0db4c36573d459cae44ac90b90c6212?tpId=85&&tqId=29868&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking
题目解析:
思路分析:
本题如果使用传统的暴力查找方式,如判断第一个串的字符是否在第二个串中,在再挪动字符删除这个字符的 方式,效率为O(N^2) ,效率太低,很难让人满意。
所以我们采用哈希映射法进行解决:
哈希映射的思想:
第一步:
因为ASCII表中一共有256个字符,所以我们可以定义一个数组,初始化为0;hash[256] = {0};
第二步:
遍历str2,在hash数组中字符对应的位置(比如b的ascll是98),将这个位置中的数据0变成1(此处是起到标记作用,说明这个字符是我们要删除的字符)for (int i = 0; i < str2.size(); ++i) { hash[str2[i]]++; }
第三步:
遍历str1,将对应字符位置的数据等于0的字符保存下来,而等于1的字符则不保存,因为是要删除的字符;string result; for (int i = 0; i < str1.size(); i++) { if (hash[str1[i]] == 0) { result += str1[i]; } }
代码实现:
import java.util.*;
public class Main{
public static void main(String [] args){
Scanner sc=new Scanner(System.in);
String str1= sc.nextLine();
String str2= sc.nextLine();
HashMap<Character,Integer> map=new HashMap<>();
//1.遍历第2个字符串str2;
for(int i=0; i<str2.length();i++){
//当前拿到的字符判断之前是否存在map中;
if(map.get(str2.charAt(i))==null){
map.put(str2.charAt(i),1);
}else{
map.put(str2.charAt(i),map.get(str2.charAt(i))+1);
}
}
String ret=""
//2、遍历第1个字符串str1;
for(int j=0;j<str1.length();j++){
if(map.get(str1.charAt(j))==null){
ret+=str1.charAt(j);
}
}
System.out.println(ret);
}
}
总结