> 文章列表 > 《抄送列表》:过滤次要文件,优先处理重要文件

《抄送列表》:过滤次要文件,优先处理重要文件

《抄送列表》:过滤次要文件,优先处理重要文件

目录

一、题目

二、思路 

1、查找字符/字符串方法:str1.indexOf( )

2、字符串截取方法:str1.substring( ) 

 三、代码

详细注释版:

简化注释版:


 

一、题目

题目:抄送列表          题目链接:抄送列表

        NowCoder每天要处理许多邮件,但他并不是在收件人列表中,有时候只是被抄送。他认为这些抄送的邮件重要性比自己在收件人列表里的邮件低,因此他要过滤掉这些次要的邮件,优先处理重要的邮件。
        现在给你一串抄送列表,请你判断目标用户是否在抄送列表中。

输入描述:
输入有多组数据,每组数据有两行。

第一行抄送列表,姓名之间用一个逗号隔开。如果姓名中包含空格或逗号,则姓名包含在双引号里。总长度不超过512个字符。

第二行只包含一个姓名,是待查找的用户的名字(姓名要完全匹配)。长度不超过16个字符。

输出描述:
如果第二行的名字出现在收件人列表中,则输出“Ignore”,表示这封邮件不重要;否则,输出“Important!”,表示这封邮件需要被优先处理。

示例1:
输入
Joe,Kewell,Leon
Joe
"Letendre, Bruce",Joe,"Quan, William"
William
输出
Ignore
Important!

二、思路 

        要点是字符串的处理。对于第一行字符串的输出,我们直接对其进行处理,即将名字直接进行存储(set),在这里就直接对“”中的名字进行处理。当输入第二行的时候,直接在set中进行查找即可。(详细注释在代码中)

1、查找字符/字符串方法:str1.indexOf( )

  • public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。

2、字符串截取方法:str1.substring( ) 

public String substring(int beginIndex)

public String substring(int beginIndex, int endIndex)

  • beginIndex -- 起始索引(包括), 索引从 0 开始。

  • endIndex -- 结束索引(不包括)。

 三、代码

详细注释版:

import java.util.*;
/*** Created with IntelliJ IDEA.* Description:抄送列表* User: WangWZ* Date: 2023-04-15* Time: 15:34*/
public class Main2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()) {//接收第一行数据String str1 = sc.nextLine();//处理字符串Set<String> set = new HashSet<>();//从头开始遍历整个字符串//使用 indexOf( , )传入两个参数的形式,第一个参数指定要找的字符/字符串,第二个int类型参数指定要开始找的位置int i = 0;int end = 0;while(i < str1.length()) {if(str1.charAt(i) == '\\"') {//遇到了第一个 “//说明后面的名字是在“”里的//所以要在set中存储的是“”里面的一整个字符串//因此要找到第二个 ”,然后将其位置下标记录下来,最后用字符串截取方法来将其保存到set中。end = str1.indexOf('\\"',i + 1);//substring返回的字符串的范围是[i+1,end)//即截取到end之前的字符//所以end下标处的 ” 不会被截取出来。//因此可以直接放入set中String ans = str1.substring(i+1,end);set.add(ans);//最后更新i值//end此时是 ” 的下标,要查后面新的名字了,所以+1i = end + 1;} else {//没有“”的名字的情况//找到','即名字的间隔//然后把','之前的字符放入set中end = str1.indexOf(',',i);//考虑特殊情况//当最后一个名字时,名字结束没有逗号,所以end值变成-1if(end == -1) {set.add(str1.substring(i,str1.length()));break;}//不是最后一个名字set.add(str1.substring(i,end));i = end + 1;}}//处理第二行数据String str2 = sc.nextLine();if(set.contains(str2)) {System.out.println("Ignore");} else {System.out.println("Important!");}}}
}

简化注释版:

import java.util.*;/*** Created with IntelliJ IDEA.* Description:抄送列表* User: WangWZ* Date: 2023-04-15* Time: 15:34*/
public class Main2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()) {//接收第一行数据String str1 = sc.nextLine();Set<String> set = new HashSet<>();int i = 0;int end = 0;while(i < str1.length()) {if(str1.charAt(i) == '\\"') {end = str1.indexOf('\\"',i + 1);String ans = str1.substring(i+1,end);set.add(ans);i = end + 1;} else {//没有“”的名字的情况end = str1.indexOf(',',i);//考虑特殊情况//当最后一个名字时,名字结束没有逗号,所以end值变成-1if(end == -1) {set.add(str1.substring(i,str1.length()));break;}//不是最后一个名字set.add(str1.substring(i,end));i = end + 1;}}//处理第二行数据String str2 = sc.nextLine();if(set.contains(str2)) {System.out.println("Ignore");} else {System.out.println("Important!");}}}
}