2020秋招笔试—表示年份的子串

2020秋招笔试—表示年份的子串

    • 题目
    • 思路
    • 代码

题目

小明想从一段英文短文中提取潜在的年份信息,待匹配的年份的范围为1000年至3999年,包含1000和3999,输入一段英文短文,按出现次序输出所提取到的所有可能的年份字符串。

示例

输入:
And millinaires will hold 46% of total wealth by 2019,the report says.This ratio is likely to increase in 2020.

输出:
2019 2020

思路

对字符串求子串是否满足正则表达式。当然,年份子字符串需要满足:前后都不为数字字符,中间只有四个满足要求的数字字符,即 “1999” 满足要求,但"19999"不满足要求。这有两种情况:

  1. 字符串起始处或字符串结尾处,这时匹配的子串长度应该为5;
  2. 字符串中间的子串,这时匹配的子串长度应该为6;

那么对输入字符串的遍历就应该分为两步,对前5字符和后5字符的匹配;对中间子串进行6字符的匹配。

代码

public class Main {

    public boolean isYears(String s){
        return new String(s).matches("[\\s\\D][123]\\d\\d\\d[\\s\\D]");
    }

    public static void main(String[] args) {
        Scanner sc  = new Scanner(System.in);
        Main solute = new Main();
        StringBuffer sb = new StringBuffer();
        String str = sc.nextLine();
        //前5字符
        if(str.substring(0,5).matches("[123]\\d\\d\\d[\\s\\D]")){
            sb.append(str.substring(0,4));
            sb.append(" ");
        }
        //中间字符
        for (int i=0;i<str.length()-5;i++){
            String subStr = str.substring(i,i+6);
            if(solute.isYears(subStr)){
                sb.append(subStr.substring(1,5));
                sb.append(" ");
            }
        }
        //后5字符
        if(str.substring(str.length()-5,str.length()).matches("[\\s\\D][123]\\d\\d\\d")){
            sb.append(str.substring(str.length()-4,str.length()));
            sb.append(" ");
        }
        if(sb.length()>0){
            sb.deleteCharAt(sb.length()-1);
        }
        System.out.println(sb.toString());
    }
}

当然本思路会创建一大堆字符串对象,有点担心内存不够。

你可能感兴趣的:(LeetCode,&,考试真题,字符串,正则表达式,java)