2013完美未来之星复赛第一场题目——文字处理屏蔽字库

题目描述

完美世界现在正在运营DOTA2游戏,由于一些政策法规的需要对于游戏的一些聊天关键字进行屏蔽,玩家发送的聊天信息经过服务器的过滤再广播给需要接收的玩家,这样就可以将其中一些不需要显示的字给替换成*.

输入格式

第一行正整数N,表示屏蔽字库的条目数量,

接下来N行输入屏蔽字库的每个条目.

接下来的一行正整数M,表示样本的条目数量

接下来的M行输入样本的每个条目。

样本的每个条目的最长长度小于1024

其中样本的最小字符长度>屏蔽字的最大字符长度

屏蔽条目的时候需要先处理屏蔽字条目长度最长的,最后处理屏幕字条目长度最小的。

测试格式

输入:一行文字

输出:将文字需要屏蔽的字改成*以后,输出文字。

输入样例

3

完美

完美世界

DOTA2

1

完美世界代理的DOTA2即将公测。

测试样例

********代理的*****即将公测

java源代码:

package org.sub.zyb;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Sub1 { 
 public static void main(String[] args) {
  
  //输入条目个数和测试条目
  Input input = new Input();    
  int n = input.getInt(); 
  String[] bar = new String[n];
  for(int i=0;i<n;i++){
   bar[i] = input.getString(); 
  }
  
  //将输入的条目字符串降序排列,这样可以保证先替换掉比较长的字符,否则会出现“**中国代理的”这种情况
  Operate.sort(bar);
  
  //输入样本数目和测试样本
  int m = input.getInt(); 
  String[] sam = new String[m];
  for(int i=0;i<m;i++){
   sam[i] = input.getString(); 
  } 
  
  //屏蔽掉sam数组测试条目中的敏感字符
  Operate.replace(bar, sam);
  
  //输出屏蔽后的字符
  for(int i=0;i<m;i++){
   System.out.println(sam[i]);  
  } 

 }

}

/*
       信息输入类
*/
class Input{
 private BufferedReader buf = null; 
 public Input(){
  this.buf = new BufferedReader(new InputStreamReader(System.in));
 }
 
 // 获取输入的字符串
 public String getString(){
  String temp = null;
  try {
   temp = this.buf.readLine();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return temp;
 }
 
 //  获取输入的整数
 public int getInt(){
  int temp = 0;
  String str = null;
  boolean flag = true;
  while(flag){
   str = this.getString();
   if(str.matches("^\\d+$")){
    temp = Integer.parseInt(str);
    flag = false;
   }else{
    System.out.println("Input error,please input an integer:");
   }
  }  
  return temp;
 }
}

/*
 对输入的信息进行操作的类
 */
class Operate{
 
 //排序方法,先将String数组转化为StringBuffer数组,再根据字符串长度降序排列,这样可以降低开销,最后再转化成String数组
 public static void sort(String[] arr){
  StringBuffer[] brr = new StringBuffer[arr.length];  
  for(int i=0;i<arr.length;i++){
   brr[i] = new StringBuffer(arr[i]);
  }  
  for(int i=0;i<brr.length-1;i++){
   for(int j=i+1;j<brr.length;j++){
    if(brr[i].length()<brr[j].length()){
     StringBuffer temp = brr[i];
     brr[i] = brr[j];
     brr[j] = temp;
    }
   }
  }  
  for(int i=0;i<arr.length;i++){
   arr[i] = brr[i].toString();
  }
 }
 
 //替换字符串方法,替换掉测试样本中的敏感字符
 public static void replace(String[] bar,String[] sam){
  for(int i=0;i<sam.length;i++){
   for(int j=0;j<bar.length;j++){
    if(sam[i].contains(bar[j])){
     StringBuffer replaced = new StringBuffer();
     for(int k=0;k<bar[j].length();k++){
      replaced.append("*");
     }
     sam[i] = sam[i].replace(bar[j], replaced.toString());
    }
   }
  }  
 }
 
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值