第一次至第三次PTAJava大作业分析

(1)前言:

三次题目集的知识点:
正则表达式(Regular Expression,简称Regex或RegExp)是一个强大的文本处理工具,用于匹配、查找和替换字符串。以下是正则表达式的主要知识点总结:

基本字符:

字面字符:表示自身的字符,如a、1、$等。
转义字符:使用\作为前缀,如\n表示换行。
字符类:

单字符:用[ ]表示,如[abc]匹配任意一个字符a、b或c。
范围:如[a-z]匹配任意小写字母。
排除:使用[^ ]表示,如[^0-9]匹配任意非数字字符。
预定义字符类:

\d:匹配数字,等价于[0-9]。
\D:匹配非数字。
\w:匹配单词字符,包括字母、数字、下划线。
\W:匹配非单词字符。
\s:匹配空白字符,如空格、制表符、换行符。
\S:匹配非空白字符。
数量词:

*:零次或多次。
+:一次或多次。
?:零次或一次。
{n}:恰好n次。
{n,}:至少n次。
{n,m}:至少n次,至多m次。
边界匹配:

^:匹配字符串开始。
$:匹配字符串结束。
\b:匹配单词边界。
\B:匹配非单词边界。
分组和引用:

使用( )进行分组。
\1, \2, ...:反向引用,引用之前的分组。
零宽断言:

(?=...):正向预查。
(?!...):负向预查。
(?<=...):正向后查。
(?<!...):负向后查。
替换和捕获:

String.replaceAll(regex, replacement):替换匹配的字符串。
Pattern和Matcher类用于更复杂的字符串操作和捕获组。
匹配模式:

Pattern.CASE_INSENSITIVE:忽略大小写。
Pattern.MULTILINE:多行模式。
Pattern.DOTALL:.匹配所有字符,包括换行符。
工具和应用:

使用在线正则表达式测试器进行调试。
编写单元测试以验证正则表达式的正确性。
在编程语言中使用正则表达式库进行字符串处理。

数据类型和变量:包括基本数据类型(例如int、double、boolean等)以及变量的声明、初始化和赋值。

运算符:包括算术运算符、比较运算符、逻辑运算符和位运算符等。

控制结构:包括条件语句(if-else)、循环结构(for、while、do-while)和switch-case等。

方法:包括方法的声明、定义、调用、参数传递和返回值。

类和对象:包括类的定义、构造方法、字段、方法和对象的创建和使用。

继承和多态:包括继承的基本概念、重写、重载和多态的应用。

数组:包括一维数组和多维数组的声明、初始化和遍历。

字符串操作:包括字符串的声明、连接、分割、查找等常见操作。

异常处理:包括try-catch-finally语句,以及常见异常类型的处理。

基本数据结构:例如列表、栈、队列、哈希表等数据结构的基本操作和应用。

题量:虽然题目数量不多,只有三道题,但是最后一题难度太大了,并且分数占比很大

难度:前两道题目难度不大,算简单,但是最后一题的连贯性很强并且很复杂

(2)设计与分析:
下面是我第一次PTA的最后一题

很抽象地把所有类放在了一个类里面,导致我最后分不清类,也未完成作业

在这次教训后,
我在后面的PTA作业中将类分块放,有了一些进步,也让我对Java这个语言的精髓有了更多的理解
以下是我第二次Java最后一个题目的代码
![](https://img202
4.cnblogs.com/blog/3433267/202404/3433267-20240421225954357-1257459199.png)
但是在第三次作业中,我看见题目实在很难读懂,所以没有花时间在最后一题的解决上
但是在写题目过程中,我学会了很多Java的知识点:首先是对集合概念更加理解,单列集合和双列集合,每个集合的操作,例如s.forEach(...): forEach 方法用于迭代集合 s 中的每个元素,并对每个元素执行指定的操作。
new Consumer() { ... }: 创建了一个匿名内部类实现了 Consumer 接口的实例。
public void accept(String st) { ... }: 实现了 Consumer 接口中的 accept 方法,该方法定义了对集合中每个元素的操作。
除此之外,对有无索引的概念更加清晰:有索引:

有索引通常指的是支持通过索引位置来访问元素的数据结构,比如数组和某些列表实现(如 ArrayList)。
对于有索引的数据结构,可以通过索引值来直接获取或修改特定位置的元素,这样可以在常量时间内(O(1) 时间复杂度)完成操作。
无索引:

无索引可能指的是某些数据结构或方法不支持通过索引来直接访问元素,而是通过其他方式进行操作的情况。
例如,链表(如 LinkedList)通常不支持随机访问,而是需要从头开始顺序遍历到目标位置才能访问到特定的元素。这样的操作通常需要线性时间(O(n) 时间复杂度)。
某些方法也可能不直接操作特定索引位置的元素,而是基于其他条件进行操作,例如过滤器或映射函数。
因此,区分有无索引的主要区别在于对元素的访问方式和操作效率。有索引的数据结构通常支持快速随机访问,而无索引的数据结构通常需要顺序访问或者基于其他条件来操作元素
System.out.println(st);: 在 accept 方法中定义了对集合中每个元素的操作,这里是打印每个元素。
除此之外,我还对正则表达式更加了解,在以前学习C语言的时候我常常觉得去匹配或者配对字符串的方法只有遍历然后做对比,但是通过使用正则表达式,我会觉得更加方便,例如匹配数字的开头或者字符串格式,这些工作通过使用正则表达式使得几十分钟的查询和配对的事情变得几秒钟就能解决,大大提高了代码的效率和程序员的精力,所以我认为发明更加便捷是方式在当今AI盛行的社会下程序员能打败AI的途径之一。

(3)采坑心得:虽然我没写出什么,但是我觉得要注重细节,比如输入方法的问题,我之前一直输入会读入下一行的空格,但是经过同学的帮助,我发现在输入和输出上面都有很大y异同
除此之外,对于正则表达式的运用过程中,我发现除了匹配之外,更多的是捕捉,因此我会在接下来的学习中多运用正则表达式的一些精髓,以下是我在正则表达式中的踩坑心得贪婪匹配:默认情况下,正则表达式会尽可能匹配更长的字符串。如果不想匹配最长的字符串,可以使用非贪婪量词(如*?、+?、{n,m}?)来匹配最短的字符串。

特殊字符转义:正则表达式中有些字符具有特殊含义,如.、*、+等,如果想要匹配它们的字面值,需要使用\进行转义。

字符类的范围:在字符类中使用范围时要注意ASCII编码顺序,例如[A-Za-z]可以匹配大小写字母,但[a-Z]是错误的范围。

边界匹配:使用边界匹配符号时,如^和$,要确保它们被正确放置,否则可能导致匹配失败或匹配到不符合预期的结果。

预定义字符类的使用:使用预定义字符类时要注意其适用范围,如\d匹配的是数字字符,不包括符号、小数点等。

分组的优先级:分组在正则表达式中具有优先级,如果想要改变默认的优先级,可以使用括号来明确分组的范围。

正向预查和负向预查:预查是零宽度匹配,匹配的是位置而不是字符本身,要注意预查的位置和匹配内容,避免出现匹配不符合预期的情况。

性能考虑:正则表达式的效率可能会受到输入字符串的长度和复杂度的影响,需要根据实际情况进行优化,避免出现性能问题。

(4)改进建议:在对一些高频率使用的方法编码时,我认为应该创建一个单独的类来实现,这样不仅能更高效地解决问题,还能将代码简化,大大提高了代码的可读性。理解基本概念:Java是一门面向对象的编程语言,首先需要理解面向对象编程的基本概念,如类、对象、继承、多态等。

掌握语法:学习Java需要熟悉其语法规则,包括变量、数据类型、运算符、流程控制语句等,这些是编写Java程序的基础。

编程实践:通过实际编程项目来巩固所学知识,可以从简单的程序开始,逐渐增加复杂度,这有助于加深对Java编程的理解和掌握。

阅读文档:Java有详细的官方文档和教程,可以通过阅读文档来了解Java的各种特性和API的使用方法,这对于解决问题和提高编程效率非常有帮助。

多练习调试:在编写代码时经常会遇到错误,要学会通过调试工具找出问题并进行修复,同时要注意编写清晰、简洁的代码以提高可读性和维护性。

(5)总结:
理解问题的本质:有时候做错题目是因为没有完全理解问题的要求。重温题目,确保理解每个要求和限制条件。

仔细阅读文档和资料:Java有很多文档和教程,重点是理解核心概念。深入阅读文档能够帮助更好地理解和应用Java的特性。

积极动手实践:练习是学习的关键。多写代码,多做练习题,通过实践来加深对Java知识的理解和应用。

查找和理解错误:当做错题目时,不要气馁,而是要耐心查找错误并理解其原因。错误信息、调试器和打印语句都是很有用的工具。

学会向他人请教:有时候别人的观点和解释能够帮助我们更好地理解问题。不要害羞,向老师、同学或者在线社区寻求帮助。

逐步提高难度:先从简单的题目开始,逐渐增加难度。这样可以建立起对基础知识的扎实理解,并且逐步提高解决问题的能力。

保持耐心和毅力:学习编程是一个持续的过程,不要急于求成。保持耐心,坚持不懈,相信自己的能力。

记录和总结:在做错题目后,记得记录下错误和正确的解法。这样可以形成一个学习笔记,帮助巩固知识点。

posted @ 2024-04-21 23:23  付佳愉  阅读(18)  评论(0编辑  收藏  举报