Pta题目集1~3总结Blog

发布时间 2023-03-26 18:18:36作者: 采姑娘的小代码

1. 前三次题目集的大体总结

第一次题目集的总体题量和难度都是比较高的,由于刚刚接触Java,对于前面的几道题还可以用简单的if语句和for语句完成,但随着难度的上涨简单的循环判断渐渐无法满足题目的要求,我开始发现题目开始逐渐着重于算法思路方面。

从第二次题目开始,我发现依然还是循环的嵌套,但条件和限制在逐渐增多,对于思维的严谨性有更高的要求,特别是从7-9开始,问题不仅仅是思维的逻辑性,更开始要求算法的精简与效率。

第三次作业的难度也是比较大的,这也是作业第一次中开始使用类来处理问题在前两题对于类和方法的应用有了一定的基础,第三题则开始为第四题打基础,直到7-4则直接出现了一个非常综合全面又与前面的题息息相关的压轴题。我在7-4上投入了相当多的时间,改过两次算法,写了两天才总算完成了这次习题.

在知识点方面

第一次题目集的第1,2,4小题都是对已知条件进行简单的if else判断即可。第3,5题则加入了for循环的嵌套,多重循环。第6题则开始接触字符串,而6,7,8题都针对字符串中的元素的删改。第9,10,11小题是我认为第一次作业中的难题,对于刚接触java的我难度较大。第12题则是注重于思路,也为下面写算法的1题做了一个铺垫。

第二次题目集相对第一次会好一点,第1小题需注意double和float的精确度。从第2题开始到第6题基本都是对于if else和循环的组合使用。第7题则是上次第5,6题的一个延伸。第8题则注重判断的严密性,如何用代码来严谨地判断,是这题的关键。最后一题又是要通过条件来设计算法。

第三次题目集则开始大量地使用类来写,第3题是对上一次最后一题算法的升级,而第4题则是这类算法的一个较复杂和全面的综合性考题。

2. 设计与分析

  1. 7-3定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

 

 

 

这道题的关键在于对于类里面算法的设计,特别是对于求下一天的算法是这道题的关键所在。因为老师给的类的元素和方法比较全面,具体到写题时就只剩下了算法的设计,具体分析问题时才发现问题的复杂在于闰年的2月以及一些临界的日期需要拆出来单独判断,把这些问题想清楚后,写的时候只需要一直if else判断即可。

 

7-4参考题目3和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

 

 

 

这道题便是上一题的“升级版“,在上一道题求前一天的基础之上拓展为求前n天和后n天,起初思考这个问题感觉非常复杂,被上一题的思维模式所固化了,开始思考在穿过的n天中的跨年跨月以及闰年的情况,持续写了一部分代码结果越写越感到复杂,以及情况太多无从分析。于是我开始请教同学,询问他人的思路,终于我明白上一道题不仅仅是这道题的简单版,可以直接写一个n次的循环去求下一天,这样就能求得下n天。在想明白这一点后我很快写出来算法,并如法炮制写出了求前n天的算法。

3. 踩坑心得

从最近的题开始说起,因为印象比较深刻。

 

在第二次作业求下一天时,由于是第一次接触这种类型的题目,在思考时就是简单地想通过穷举出所有情况的方法来设计算法,解决问题。但越复杂的问题越难以穷尽,于是就出现了下面思考不全面的情况

但在之后的第三次作业中老师给提供的用数组来存储每个月最大的天数,便一下子让需要考虑的情况变得精简的多,由原本穷尽需要考虑的每个月的情况,到现在只需考虑日期与数组的大小比较,于是情况就简单明了起来了。以下是精简过的代码(一部分)。

 

思路一下子清晰的多,自此题我开始觉得随着题目难度和复杂度的提升,看到题就写不进行深入的思考是万万不可行的,就像这道题只是简简单单地引入一个数组,其减少的思考量是很大的,一个数组便让我的算法思路变得清晰。由此可见多思考题目来精简算法不仅可以让代码看起来更加具有可读性,也能让我更加容易地写出正确的代码。

这是我这几次作业中最典型的不同算法解决问题体现出差异的题目,除此之外在之前的题目中我还出现过以下这些问题:

我在这道题中方法里写的都是balance,但我在main里面又根据实际情况定义了一个新的newbalance,且并未在相应的位置将newbalance的值传给balance,导致我新定义的newbalance并没有在之后的方法中计算,导致了大量的结果错误。以下是我所作出的修改:

在自己通过特殊值的运行调试后,我发现是由于newbalance得知没有发挥作用,于是我从开始用到newbalance的地方开始运用set方法将newbalance的值写了进去,从而解决了这个问题。这个问题我觉得也是比较典型的错误,在于写完方法后,应用时便直接放心地引用,而忘了自己在main里面对其中的变量进行了修改,这次的错误也提醒了我,在今后如果在主函数里对方法中的变量做出了改变,或者要引用新的变量来调用方法。一定要记得将新变量写入方法中去,而不是直接调用,来避免错误。

4. 改进建议

 

当时好不容易写完这道题结果发现有一个测试点总不过,我在测试用例里将负数和超过余额的数字都打进去运行,结果看了结果又在百度查询才知道是精确度的问题,在于舍去余数和四舍五入。这是我在之后的练习需要注意的点,double和float计算所带来的精度问题也需改进,这个方向上值得用心钻研可以改进。

这个是经多次练习后写的比较简洁的一个代码,对我也比较有启发。在写类和方法时尽量可以写在方法中的就不要再main中循环这样可以有效地减少代码中到处对变量的赋值和增减,直接调用方法来的更加直观与方便。这是比较让我受启发的可改进点。

5. 总结

在写过三次pta题目集,感觉个人对于编程的综合能力比起c语言时又上了一个台阶。在三次题目集的编程过程中,我见识到了各式各样的编译错误和格式错误,也积累到了一些经验,不仅如此,在做题目集的过程中,我对于java语言的一些特性也有了一定的了解,学到了在java中如何利用循环和判断的嵌套来灵活解决一些比较简单的实际问题,第三次作业则极大地加深了我对于类的理解和方法的应用。

当然对于java中的语法知识仍需更加深入地学习,目前掌握的语法知识还只是皮毛,仅仅只是java语言中基础的对于书本上的大多知识还没学习到。虽然知道这是长时间的功夫,但对于自己只会一些基础的语法知识还是比较焦虑的.

目前的学习方式是简单的写题时遇到哪些问题无法处理就去学习。这样总是感觉自己还有太多太多的知识没掌握,而且在题中应用到的刚学的新知识往往没有巩固,极易忘记,可能下次用时还需要再去查阅。希望老师可以在pta题目布置之前的课上提一下下次PTA可能会用到的知识点,这样可以给我们一个方向,让我们可以在写题之前先行学习要用到的知识,等到题目布置之后,就可以把题目作为检验知识是否掌握牢固的判断。主要是目前感觉自己的学习比较被动,只有在写到不会的题目时,才去为写题学习新的知识,不利于对于知识的掌握。而写题前老师提前给一个具体的学习方向,就可以提前学习,从而以题目来巩固知识。

在课程中,也希望老师可以先对之前写的PTA中的一些典型题目进行简单的思路或算法的讲解,为大家提供一种比较精简的思路,可以让一些同学进行思考,以及反向思考出自己代码的不足,思考自己和更好的算法之间有何差异,自己又为何没有想到,等到这样的思考多了,渐渐的就可以在之后的PTA中以更好的方法,从而提升自己的编程能力和对问题的分析能力。而不是一直沉浸于自己的笨思路,直到题目越来越复杂,无力完成,倍感焦虑 。

对于目前pta题目的难度及题量,在一周的时间限制内还是比较能够接受的,但希望实验还是尽量不要和Pta的做题时间有所重叠,同时存在多项任务会让人焦虑,可以适当缩短一项任务的时间,尽快布置下一项任务,而不是两项任务产生重叠。当然如果想要锻炼对多项任务的处理安排能力,也可以适当地延长期限时间,让我们可以以比较好的质量来更好地完成老师布置的任务和提升自己。

最后是对于我自己的总结,我从刚开始写PTA时的焦头烂额,到现在完成PTA,通过测试点时的喜悦。自己的代码能力确实在上涨,细说的话我接触到JAVA学会了一些基本的语法,一些循环,数组,方法和类,会的不多,所以对于更深层次的方法仍需继续深入地学习与研究。