第一次Blog

 前言:

  题目集1的题量偏多但是非常简单,可能因为在刚刚开始接触Java时为了让我们熟练Java的语法。整个题目集在两个小时之内轻松可以完成。到了题目集2,难度等级有了较大的提升,需要我们在类里面创建方法解决问题,题目集2需要花费一整天的时间才能完成。到了题目集3难度更是直接登顶,因为题目集3涉及到我们还没有学过的正则表达式的内容需要自学而且还需要用到关于类的知识。正则表达式的学习和题集3的完成花费了整整一个多星期的时间,虽然这个过程是很艰苦的,但是到最后确实学到了很多东西。题目集的题量是一次比一次少,但是难度却是一次比一次难。每一次的题目集都需要用到我们当时所学习的Java的相关知识,每一次的题目集对我来说都是一次难度不小的考验。

 设计与分析:

  关于圈复杂度

  上课的时候老师和我们讲了关于圈复杂度的问题,我们需要把圈复杂度尽量的降到最低,使我们的代码更清晰,易维护。

 

 

 

 

 

  题目集1的7-8:判断三角形类型

  圈复杂度如下:

  题目本身并不难,但是需要多次循环输入数据并判断符不符合规则,所以我多次运用了for循环语句和switch语句导致圈复杂度高于10。难度上比较简单但是我的圈复杂度依旧是比较高,两次的for循环让我难以达到一个较低的圈复杂度,for循环的叠加 圈复杂度是成倍数增长的,所以在以后的代码中尽量是不能出现for循环的叠加。

  题目集2的7-4: 求下一天

  圈复杂度如下:

  

 

 

   题目难度适中。虽然不是很难,但是本题在逻辑上一定要严谨不能犯错,不然会导致后面出现大问题。本题考查的主要是在类中创建方法,在创建方法的同时要注意类的封装性。虽然难度不大但代码的圈复杂度依然居高不下,在计算天数的方法中大量运用了if和switch语句的嵌套,导致代码圈复杂度居高不下。其实代码结构依然可以进行优化变的更简洁,圈复杂度也可以得到下降。

  题目集2的7-5: 求前N天

  圈复杂度如下:

 

 

   本题是前面一题的迭代,方法上几乎没什么区别,只是略微改动了一些。这次迭代虽然能够完成其功能,但是方法的圈复杂度依旧是很高,和前面的题目一样。本次迭代主要是为了功能上的实现而没有过多去考虑圈复杂度的问题。但是其实本题的方法还有很多地方是可以去进行优化的,可以尽量地把圈复杂度降到10以下。

  题目集3的7-2:定义日期类

  圈复杂度如下:

 

  类结构图如下:

 

 

 

  本题难度依旧适中,方法是上一个题目集里就有的,方法完全可以照搬上一个题目集中的方法。但本题中不同的是需要运用到类的相关知识,需要根据题目中提供的Date类结构去构造一个类结构。在刚刚学习到类结构的相关知识的时候不太熟练的去运用类结构,会犯一些低级错误,忘记初始化,忘记声明对象等。虽然完美的按照题目要求构造出了一个一模一样的类,但是本题的圈复杂度依旧是不低的,所以还是要在优化上下功夫,不能只是把功能完善就不管了。

  题目集3的7-3:一元多项式求导(类设计)

  圈复杂度如下:

 

  类结构图如下:

 

 

   本题的难度可以说是非常大了,整整花了一个星期都是在研究这道题目上边。在一开始时做题的思维定式了,没有想到要用类的设计来解决,想着能不能只用一个类就完成。现在看来是异想天开了,刚刚开始时没有把主要研究方向放在类的设计上,而是一股脑的研究如何操作字符串。正则表达式就是要跨过的第一道大难题,正则表达式在此之前我从未接触过。在写本题之前还需要系统性的先学习正则表达式的相关知识,了解Java中的regex.Matcher类和regex.Pattern类的方法如何使用。在刚刚开始学习正则表达式的时候是非常困难的,因为之前从未见过,正则表达式对我来说就是一堆乱码,啥也看不懂。但是在学习完正则表达式之后发现它还是非常有用的(虽然学习的过程可能很痛苦),后悔自己没有早点遇见。

  在屡次碰壁之后还有在老师的提醒之下,我发现不能一股脑的研究字符串的操作。应该要先有一个大体的解题思路,然后好好想想如何去设计类结构。我的思路是在输入一个表达式之后我利用正则表达式的匹配和查找功能去进行裂项,一长串的表达式是很难处理的,但是把它分成单个的项就变得容易起来了。所以在设计类的时候我就设计了一个类,这个类就是单独的一个项,指数和系数是它的私有属性。利用matcher.find()和matcher.group()的方法查找和匹配单个项,再对单个项进行操作就变得很简单了。把对单个项的求导结果加到一个字符串里,然后最后输出字符串。

  本题的圈复杂度不高,但是再努努力应该是可以降到10以下的。在类结构的设计上不够好,本题只设计了一个类,如果按照单一职责原则的话应该是要设计四到五个类的,在日后的优化中主要是要对类结构作出调整。‘

  采坑心得:

  1)在前两个题目集中,题目的难度都不大。提交时要注意的是格式问题,我就因为是格式不对输出的语句少了一个点,导致有几个点答案错误,一开始以为是自己的逻辑问题,然后调试了很久发现还是答案错误。最后搞得我都怀疑人生了发现是因为输出语句漏了一个点,这种低级的错误不仅浪费精力和时间,而且还搞人心态。所以以后遇见多个答案错误可以先看看是不是输出的格式错误,再来排查是不是逻辑错误。

  2)对于一些特殊的测试点,比如题集2中的某年某天,自己在调试的时候一定要多调试几遍,并且测试所有你可能想到的点,确保自己的程序不会在一些特殊的测试点卡住。

  3)关于正则表达式:

 

 

   题集3的正则表达式校验的部分正则表达式长的离谱,正则表达式还是越短越简洁越好。这种长的离谱的正则表达式不仅别人难以理解,自己也会被自己绕晕。所以尽量写的越简洁越好,在刚刚开始接触正则表达式的时候想到什么写什么导致写出一大长串这个玩意。

 

  在把它分成几部分之后就更容易理解,比之前的好多了。

 

   改进建议

 

  在题目集1和2中,题目的难度并不大,但是我在做题的时候只顾着去实现功能。没有在代码的圈复杂度上下功夫。导致反而越是简单的题目代码的圈复杂度越高,在之后的题集中不仅是要完成功能的实现,更重要的是要在设计和圈复杂度上下足功夫。

  在题集3中,遇见难度较高的题目时,不要着急去写代码,要先把题目思路给捋清楚。先设计好类和方法,最后再来写代码。切记不能暴力写题,写题之前的思考很重要!

  在优化上下功夫,不能只是把功能实现,在完成功能后要对代码进行迭代优化。

  要学会熟练的运用编译软件去调试程序,找出自己的逻辑错误。

  学会用Debug调试程序,根据变量框的数值变化找出逻辑错误。

  提高代码效率,写注释!!

  

 总结:

  对于本阶段三次题目集,难度系数呈指数增长。特别是最后一次题目集,对我们来说是一个很大的挑战。但是经过这一个月的学习,自己把所有的题集都攻克,是有很大的成就感的。对于每一次的题集,都会运用到老师上课时讲到的方法。题集一目的是为了让我们更加熟悉Java的语法,题集二中运用到了类中的方法,相当于c语言中的函数。题集三主要是类的设计,也是最难的题集。其实学习Java更重要的是学会面向对象的思维,这和c语言的学习有很大的不同。我们所学的不仅仅是编程语言,而是面向对象的思维模式。学习Java的模式和c语言很不一样,所以老师经常说不能老拿学习c语言那一套来学习Java。Java这门课是有难度的,所以在以后的学习中还需加倍努力。

  要铭记在写代码的过程中要遵循的两大原则:

  单一职责原则 :
  1.就一个类而言,应该仅有一个引起它变化的原因 ,计算出来的不能是属性。
  2.一个类尽量不和其他类产生关系,一个方法只干一件事。

  面向对象原则:
  1 单一职责原则:每个类/方法围绕一个主题
  2 迪米特法则:不要和陌生人说话

  在这一阶段的学习中,我对Java这门编程语言的理解更深了。Java这门语言给我们带来了很多c语言中不能实现的东西,而且面向对象的思维模式也给我带来很多不一样的地方。

我还有许多地方有待进步,比如类的设计,也需要抓紧时间学习。

  

 

 

 

 

 

 

 

 

posted @ 2021-04-04 23:27  o0o0  阅读(124)  评论(0)    收藏  举报