【笔试强训编程题】Day1.(组队竞赛100449)和(删除公共字符69390)

作者简介:大家好,我是未央;

博客首页:未央.303

系列专栏:笔试强训编程题

每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!

文章目录

前言

一、组队竞赛100449

二、删除公共字符69390

题目描述:

题目解析:

总结


前言

今天我们将进入到编程题的训练当中,这里面的编程题大多数都是牛客的习题;编程题对我们以后的笔试环节有着很大的作用,所以必须熟练的掌握和运用;话不多说,让我们看看第一天的题目吧!!!!


一、组队竞赛100449


二、删除公共字符69390

题目描述:

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

输入描述:

每个测试输入包含2个字符串;

输出描述:

输出删除后的字符串;

示例:

牛客链接: https://www.nowcoder.com/practice/f0db4c36573d459cae44ac90b90c6212?tpId=85&&tqId=29
868&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);
    }
 }

总结

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值