前言

第一次pta作业题量较多,但由于是第一次作业,难度并不会太大甚至是可以称得上是简单的程度了。而第一次pta主要是考察我们对java基本知识的了解,还没有正式接触面向对象这个概念,因而本次blog只会对第一次pta作业进行简单的分析总结,不会进行深入的探讨。

第二次的pta作业相较于第一次而言题量减少,从九题变成四题,刚看到作业发布时还窃喜只有四题,殊不知看完题目后苦不堪言。对于当时刚浅显的接触对象和类的我来说,第二次pta作业相比较比第一次的难度无异于是直线上升的。前两题是菜单题,考察对象与类的基本知识。个人认为第三题难度最大,是关于日期类的问题。第四题难度适中,刚开始看一头雾水,不知何从下手,从大佬那了解了dp算法之后才攻破了这题。

第三次的pta作业相较于前两次不管难度和题量都是较大的,第一题是菜单题的第三版,相较前两次菜单题加入了桌号的概念,光是题目就上千字,只是看着就让人望而却步….后面六题难度不大,其中第六题难度最小,只是单纯的计算,对于浮点数的考察,三四题考到了哈希表的应用,用于删除重复的数据,而第四题则是增加了对于删除重复数据后的排序问题;第五题考察了对数据的封装,加深了我对面向对象的理解;第七题则是让我们了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法,查阅了相关资料后很容易就可以上手并且只用了21行代码就解决了问题。

设计与分析

本次作业分析参考SourceMonitor的生成报表内容以及PowerDesigner的相应类图,部分题目比较简单就简单文字分析一下不用报表和类图来分析了。

第一次作业

7-1 身体质量指数(BMI)测算

该题主要考察if else的使用,基本上按照题目要求来写没有什么难度。在控制台分别输入体重和身高两个浮点数,先判断浮点数是否大于零,再进行bmi=w/(h*h)运算,以bmi的值为条件来选择输出fat,thin,fit。

7-2 长度质量计量单位换算

该题主要也是考察浮点数的运算,将重量单位千克转化为磅,将长度单位米转化为英寸。值得一提的是在输出时由于java的特性字符可以直接用“+”进行拼接,这一点在之前学c语言时是想都不敢想的,c语言的字符凭借还要借助相应的函数,这么一对比java显得方便得多。

7-3 奇数求和

这题则是同时考察了选择,循环和数组,输入十个数字放到数组中,选择当中的奇数进行求和。

7-5 游戏角色选择

这题也是考察选择,但使用switch语句更为合适,把四个种族作为case,每个case中则有四个职业,选择后输出相应结果即可。

7-6 学号识别

这题主要用了substring和equals这两个方法,通过substring来返回字符串指定的一段子字符,也就是学号中的其中一段数字,再用equals识别截出来的子字符串。7-9 二进制数值提取这题与该题相似都是用了这两个方法,只不过在号码多加了个循环来把截取的二进制字符组合到一起进行输出。

第二次作业

7-1 菜单计价程序-1

SourceMonitor生成报表:

 

powerdesigner生成类图:

 

第一次的菜单还算比较简单,虽然说对于当时刚刚了解对象与类的我来说还是挺难的,只能硬着头皮边写边学了。按照题目要求设计了除主类外的菜品类Dish类,菜单类Menu类,点菜记录类Record类和订单类Order类。在Dish类中记录每道菜的信息如菜品名称和菜品单价,并且还有一个int getPrice(int portion)方法来计算菜品价格;Menu类中则是记录菜品信息,引用一个Dish类的对象数字组来保存题目给出的菜品信息,定义一个Dish searthDish(String dishName)方法来根据菜名在菜谱中查找菜品信息,返回Dish对象;Record类组要是用来计价,Dish类中的getPrice方法返回菜价给Record类中的getPrice方法;Order类中引用了一个Record类的对象数组来保存每一道菜的菜品记录,并计算订单的总价格。

7-2 菜单计价程序-2

SourceMonitor生成报表:

 

powerdesigner生成类图:

 

第二次菜单题比第一次多了删除点菜记录的功能,除此之外相较于上次菜单,这里从把对象放到对象数组内改为放到ArrayList当中,使得删除点菜数据时更为方便。并在输出时除了总价以外还输出了点菜信息,即点的菜名,份额,每种菜的总价。

7-4 小明走格子

 

其中b[i]表示有i个格子时的走法;则状态转移方程为p[i]=p[i-1]+p[i-2]+p[i-3]+p[i-4];优化可以得到p[i]=2*p[j-1]-p[j-5]。这题可以说是只能用dp算法来解决,至于原因在后面的踩坑心得里说明。

 

第三次作业

7-1 菜单计价程序-3

SourceMonitor生成报表:

 

powerdesigner生成类图:

 

第三次菜单在第二次菜单的基础上加入了菜品订单日期和桌号table的要求,难度可谓是直线上升,这里就得设计一个Table类,在其中引用Order类对象,来展示每一桌的菜品订单信息以及计算每一桌的菜品总价。

输入点菜信息时还要判断日期是否在营业期内,如果不在则点菜不成功,而且在营业日期不同时间段有不同的优惠折扣。而针对这两个问题用分别在Table类中设计getSum方法来判断时间段选择折扣来计算总价,设计isOpen方法判断点菜日期是否在营业时期内。

7-3 去掉重复的数据

这题在处理重复数据时用到了哈希列表

把数据添加到LinkedHashSet中,自动会把这组数据中的重复数据删掉,由于LinkedHashSet虽然有顺序但是没有索引,所以在输出数据时要使用迭代器。

7-4 单词统计与排序

输入一段文本后用split按逗号句号把句子分割成单词放入一个字符串数组中

在比较单词时用到了compareToIgnoreCase方法可以完全满足题目(这里使用compareTo会受字母大小的影响而比较不成功导致排序错误,所以要使用compareToIgnoreCase方法来忽略字母大小写)。

踩坑心得

这三道菜单题难度差不多都是跳跃上升,第一道菜单题没有优化几次就能过,而菜单二菜单三在刚写完能运行的基础上放到pta里提交基本上只能过少数几个测试点,后期只能一个测试点一个测试点的改良优化,我的经验是,对与菜单这种题只能一步一步优化出来,而不能急于求成,不要想着一遍过,只能一点一点的拿分,通过测试点的测试条件来找到自己代码中有哪些不足。

要值得注意的是小明走格子那题只能用dp算法来写,这题的时间限制卡的很死,如果用其他的常规方法来解决基本上都是代码运行超时,大概出题老师本意就是考察我们对于动态规划的理解吧。并且只用dp算法来解决的话,最后一个测试点还算运行超时不能拿满分,在大佬同学的帮助下我才知道还有快速读写这种东西,最终才拿了满分。所以说在遇到困难时要多与同学交流,说不定能有以外的收获呢。

总结

前三次pta作业中除了三次菜单题,其他大部分是对java语言的基础考察,通过这些问题,我也学到了许多java中非常有用的方法,也深切体会到java这门语言的方便之处,毕竟有这么多现成的方法可供使用。而重三次菜单题主要是考察了对象和类,也是通过这三题我慢慢的体会到了java中面向对象这一概念。

我对于pta的期望是难度跨度不要太大,要不然真的一下子很难接受得过来。