4-6题总结

零、目录

1.前言

2.设计与分析

3.踩坑心得

4.改进建议

5.总结

一、前言

题集四

知识点:正则表达式的规则编写与灵活使用、类的继承、函数重写

题量:适中

难度:

7-1 ★★★✩✩

7-2 ★★✩✩✩

7-1 ★✩✩✩✩

题集五

 

知识点:类的继承与封装、排序算法

题量:适中

难度:

7-1 ★✩✩✩✩

7-2 ★✩✩✩✩

7-3 ★✩✩✩✩

7-4 ★★★✩✩

7-5 ★★✩✩✩

备注:7-4题目测试点有问题,据称是在特定字符数之后的部分关键词不计入才得分。

题集六

知识点:正则表达式的规则编写与灵活使用、继承与多态、接口的实现

题量:适中

难度:

7-1 ★✩✩✩✩

7-2 ★✩✩✩✩

7-3 ★✩✩✩✩

7-4 ★✩✩✩✩

7-5 ★★✩✩✩

7-6 ★★✩✩✩

 

二、设计与分析

(1)题集四(7-2)、题集五(7-4)两种日期聚合的优劣与比较

前者是dateUtil类中绑定Day对象,Day对象中绑定Month对象,Month对象中绑定Year对象

后者是dateUtil类中绑定Day、Month、Year对象

前者能在Day增减函数中就判断月份和年份的变化,可以调用到Year和Month对象,但嵌套调用比较繁琐

后者能在Util类中直接获取D、Y、M对象,不用层层嵌套调用,但对于日期增减引发的变化需要在此类中完成

(2)题集四(7-3)

Circle和Rectangle继承Shape类 二维图形继承图形类

Ball继承Circle类 三维图形继承二维图形类

Box继承Rectangle类 三维图形继承二维图形类

 

 

(3)题集六(7-5)

Triangle、Circle、Rectangle均继承Shape类

 

 

(4)题集六(7-6)

Rectangle、Circle均实现GetArea接口

 

 

(4)正则表达式

题集四、7-1

日期

^(?:(?!0[0-9]*)[0-9]{1,4}([/]?)(?:(?:[1-9]|1[0-2])\1(?:[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([/]?)0?2\2(?:29))\s([1-2]?[02468]):00$

均为实型数,取值范围为[1,1000),小数点后保留 1-3 位小数或无小数(此时不需要写小数点)

^(([1-9][0-9][0-9])|([1-9][0-9])|([1-9]))((\.)((\d\d[0-9])|(\d[0-9])|([0-9])))?$

实型数,取值范围为[1,10),必须保留 2 位小数,两个开度之间用 “/” 分隔

^[1-9].([1-9]\d)$

双引号

\"(.*?)\"

单引号

\'(.*?)\'

单行注释

//.*

 多行注释

/\\*\\*(\\s*.*\\s*)*\\*/

题集六

校验QQ 号是否合格

^[1-9]\\d{4,14}$

验证码校验

^[0-9a-zA-Z]{4}$

学号校验

^2020(1[1-7]|61|7[1-3]|8[1-2])(?!00)([0-3][0-9]|40)$

(5)题集五(7-4)

Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“Key”和“Value”),其中每个Key映射到一个Value。

Map基础使用方式如下:

clear() 从 Map 中删除所有映射
remove(Object key) 从 Map 中删除键和关联的值
put(Object key, Object value) 将指定值与指定键相关联
clear() 从 Map 中删除所有映射
putAll(Map t) 将指定 Map 中的所有映射复制到此 map

排序:

0.

复制代码
 1 class ClassName implements Comparator<String>{
 2 
 3   @Override
 4 
 5   public int compare(String str1, String str2) {
 6 
 7     return str1.compareTo(str2);
 8 
 9   }
10 
11 }
复制代码

1.

1
Map<String, Integer> resultMap = sortMapByKey(map);

2.

复制代码
 1 public static Map<String, Integer> sortMapByKey(Map<String, Integer> map) {
 2   if (map == null || map.isEmpty()) {
 3     return null;
 4   }
 5 
 6   Map<String, Integer> sortMap = new TreeMap<String, Integer>(
 7     (Comparator<? super String>) new MapKeyComparator());
 8 
 9   sortMap.putAll(map);
10 
11   return sortMap;
12 }
复制代码

三、踩坑心得

7-4 统计Java程序中关键词的出现次数 (25 分)

主要集中在这题,对于还原输入的代码,一开始采用

 

    String line = "";
    StringBuilder str = new StringBuilder();
    while( !(line = input.nextLine().trim()).equals("exit")){
      //System.out.println(line);
      str.append(line + "\n");
    }

 

发现在处理多行注释的时候会出问题,于是改成

        while( !(line = input.nextLine().trim()).equals("exit")){
            //System.out.println(line);
            str.append(line + " ");
        }

发现在处理单行注释的时候无法分开

于是考虑在获取line之后就处理掉单行注释,于是改成

        while( !(line = input.nextLine().trim()).equals("exit")){
            //System.out.println(line);
            line = line.replaceAll("//.*"," ");
            str.append(line + " ");
        }

成为了最终版本。

Keywords上

复制代码
        String []keywords= { "abstract","assert","boolean","break","byte","case","catch",
                "char","class","const","continue","default","do","double","else",
                "enum","extends","false","final","finally","float",
                "for","goto","if","implements","import","instanceof",
                "int","interface","long","native","new","null","package",
                "private","protected","public","return","short","static",
                "strictfp","super","switch","synchronized","this","throw",
                "throws","transient","true","try","void","volatile","while"};
复制代码

一共53个,一个一个核对起来,生怕哪个词拼错了。

在处理特殊字符上,把这些特殊字符替换成字母a

复制代码
        s=s.replace("-","a");
        s=s.replace("*","a");
        s=s.replace("/","a");
        s=s.replace("+","a");
        s=s.replace(">","a");
        s=s.replace("=","a");
        s=s.replace("!","a");
        s=s.replace(":","a");
        s=s.replace("\\","a");
复制代码

剩余的字符则采用

s = s.replaceAll("[^a-zA-Z]", " ");

对于单词分隔采用 

\b 匹配一个单词边界,即字与空格间的位置。
Pattern r = Pattern.compile("\\b" + keywords[i] + "\\b");

 

四、改进建议

题集四 无

题集五(7-1)

可对排序做个类封装,使用ArrayList储存每个单词的类对象

题集五(7-2)

对拼接数组,拼接数组排序做个类封装

题集五(7-4)

对于拼接每行代码独立成函数,处理注释、处理符号独立成函数

题集六(7-1、7-3、7-4)

1         String pattern = "^[1-9]\\d{4,14}$";
2         Pattern r = Pattern.compile(pattern);
3         Matcher m = r.matcher(str);

将这三行封装为函数,返回Matcher对象

题集六(7-2)

对char转ascii和ascii转char做成函数

五、总结

学会:正则表达式的规则编写与灵活使用、继承与多态、接口的实现、函数重写、三种基础排序算法

进一步学习:更灵活的接口使用、正则表达式更复杂的编写

建议与意见:请对发布的PTA题目每个测试点仔细测试,测试点答案出问题写题体验极其糟糕!也会降低写题目的热情!请勿再出现!

posted @ 2021-11-13 23:39  ooopo  阅读(189)  评论(0)    收藏  举报