一、作业总结
第一次作业比较简单,都是考察基本语法,意在锻炼java基本语句的使用。在刚开始题目集1的时候我也是刚开始接触java,在这之前,我对java仅会输出"Hello World!",在进行题目集1的时候随着写题目的同时,也学习并慢慢熟练会使用java语法,并到后来题目集2进一步的使用各种算法,题目集3对类的使用。
从结果来看,对题目集3的结果并不是很满意,虽然很长一段时间都在学习正则表达式的使用,但由于思路一直没打通,题目集3完成的并不是很好。虽然题目集3只有三道题,并且前两道题也在最快的时间内把它们完成了,但学的还不够精,钻研的还不够。导致第三题完成并不是很理想。
下面对三次作业做个简要的分析。
1.判断三角形类型(第一次作业)
其实这次作业,完全是考察对if判断语句的使用,题目难并不难,只是需要注意的细节比较多,注意所有的细节才能测试通过。并且通过这道题,我才知道java存在一定误差。
else if((((a==b)&&a!=c)&&((a*a+b*b-c*c)<0.00001))||(((a==c)&&a!=b)&&((a*a+c*c-b*b)<0.00001))||(((b==c)&&b!=a)&&((b*b+c*c-a*a)<0.00001)))
{
System.out.println("Isosceles right-angled triangle");
}
在数学中,我们都知道三角形的三边a,b,c,若满足a^2+b^2=c^2,则三角形是直角三角形。但是由于java的误差,在条件语句中必须写成a^2+b^2-c^2<0.00001的形式。在这个过程中,我思索了很久,认为自己的代码并没有出现错误了,可有个测试点始终通不过,思考了很久一直没有答案,通过请教同学,才明白其中这一看似小却很大的错误。
2.IP地址转换(第二次作业)
这道题虽然代码我只写了20行不到,可是做这道题我确实是花了大半天时间,究其原因还是因为对很多java中特有的方法不会使用,一直在不停的翻阅查找相关资料用了很长那个时间。这道题后来有和别的同学讨论过,他们不少人用了很实在的方法,很凑巧的答案。可对于以后的学习来说,学会使用相关方法是有好处的。
for(int i=0;i<s.length()-7;i+=8)
{
System.out.print(Integer.parseInt(s.substring(i,i+8),2));
if(i!=s.length()-8)
System.out.print(".");
}
虽然在查找资料的过程中花费了很多时间,但这个过程中我会使用了Integer.parseInt(String),其作用就是将String字符类型数据转换为Integer整型数据;还有stringObject.substring(start,stop)用于提取指定的子字符串。也许大家觉得学习这个很是简单,但对于基础不好,理解能力也比较差的我来说,终于学会了它的用法是件很不容易的事。写了不少java代码后,很多算法语句其实是建立在c语言的基础上的,c语言的基础没有打扎实,java代码也并不好写。
3.判断闰年及星期几(第二次作业)
在写这道题之前,我虽然会使用c语言的函数调用,但对于java的调用函数语句并不会。好在题目中所给的使用函数给了很好的提示,所以做题的过程中遇到的困难小了很多。学习使用c语言类似的void(),string(),int(),double()等方法以外,还学会使用boolean类型的方法。
if(isLeapYear(year))
{
System.out.println(year+" is a leap year.");
}
else
System.out.println(year+" is not a leap year.");
使用了boolean方法后,语句可以简洁很多,而且在写代码的时候思路非常清晰,不容易出错。
另外,在java中使用方法,少带参数。
Main类结构:

4.求下一天(第二次作业)
这一题与上一题类似,均为对方法的使用的锻炼。对boolean方法的使用,进一步得到加强。boolean方法的使用使代码更精炼。熟练地使用,会提高我们写代码的效率。这道题对细节考察偏多,要考虑多种情况,而方法的运用提高了效率,使代码看上去清晰易懂。
else if(month == 12)
{
if(n < 0)
{
if(day - n > 31)
{
year = year + 1;
month = 1;
day = day - n - 31;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
month = month - 1;
day = day - n + 30;
}
else
day = day - n;
}
}
在这里,其实一开始,我并没有考虑到12月份后的下一天,机器是靠代码来运行的,如果想让它知道下一天是哪一天,需要考虑好这些细节,编写出相应的代码命令它去执行。
Main类结构:

5.求前N天(第二次作业)
这道题是前两题的基础,但这道题我的代码着实写的很不好,代码过于简单,而且步骤过于复杂,没有简化。用了过多if...else语句,反反复复,令人看着很费劲。虽然最后能够正确运行, 但由于题目中说明不能用日期类和方法,写这道题的时候,确实更应该仔细,生怕漏了其中一点。做这类日期类题目,不仅需要考虑是否是闰年,还要判断月份,看着题目不难,但其实真正自己写,我认为列草稿是一个比较好的习惯,在稿纸上清晰的画出需要考虑的点,不容易漏,减少提交后答案错误的次数。并且在这道题,不同于上面求下一天,这里需要考虑是几天前还是几天后,根据输入的N的值来决定是过去还是未来。
if(month == 5 || month == 7 || month == 10)
{
if(n < 0)
{
if(day - n > 31)
{
month ++;
day = day - n - 31;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
month = month - 1;
day = day - n + 30;
}
else
day = day - n;
}
}
else if(month == 1)
{
if(n < 0)
{
if(day - n > 31)
{
month ++;
day = day - n - 31;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
year = year - 1;
month = 12;
day = day - n + 31;
}
else
day = day - n;
}
}
else if(month == 4 || month == 6 || month == 8 || month == 9 || month == 11)
{
if(n < 0)
{
if(day - n > 30)
{
month ++;
day = day - n - 30;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
month = month - 1;
day = day - n + 31;
}
else
day = day - n;
}
}
else if(month == 12)
{
if(n < 0)
{
if(day - n > 31)
{
year = year + 1;
month = 1;
day = day - n - 31;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
month = month - 1;
day = day - n + 30;
}
else
day = day - n;
}
}
else if(isLeapYear(year))
{
if(month == 2)
{
if(n < 0)
{
if(day - n > 29)
{
month = month + 1;
day = day - n - 29;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
month = month - 1;
day = day - n + 31;
}
else
day = day - n;
}
}
else if(month == 3)
{
if(n < 0)
{
if(day - n > 31)
{
month = month + 1;
day = day - n - 31;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
month = month - 1;
day = day - n + 29;
}
else
day = day - n;
}
}
}
else if(!isLeapYear(year))
{
if(month == 2)
{
if(n < 0)
{
if(day - n > 28)
{
month = month + 1;
day = day - n - 28;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
month = month - 1;
day = day - n + 31;
}
else
day = day - n;
}
}
else if(month == 3)
{
if(n < 0)
{
if(day - n > 31)
{
month = month + 1;
day = day - n - 31;
}
else
day = day - n;
}
else
{
if(day - n < 1)
{
month = month - 1;
day = day - n + 28;
}
else
day = day - n;
}
}
}
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}
但事后,看我之前写的代码,我觉得可以改动下,每次都要重新判断,循环太多,导致代码运行也很慢。
虽然很多时候,我们看着测试点去过,但是测试点非常的细节,也让我在不断提交测试的过程中发现代码的漏洞,从而去改动代码。
6.定义日期类(第三次作业)
刚开始,我是并不会使用类的相关方法,说实话,题目集3 的前两道题我用了整整一天才写完。我刚开始写的时候,因为不太懂,书上的很多代码我并不能全部看得懂,只能一行一行去理解到底什么意思,跟着书上一起打,第一题确实这么过来,第二题增加了点难度,好在题目中已经给了类图,思路非常清晰明确。
Date date = new Date(year, month, day);
date.checkInputValidity();
定义类非常的方便,语句也只要两行就可以定义一个新的类,并执行类中的相关语句,避免了代码过长看起来不够整洁。
与在编译器上不同,代码复制到PTA上类需要改为static class Date这样子的,否则会编译不通过。
与题目集2不同,这次题目集的题目方法不可带参数。
Main类结构:

7.一元多项式求导(类设计)(第三次作业)
这道题思路上是筛选出每一项存入ArrayList数组后,筛选出每一项的系数和指数,进行相关语句实现求导过程,最后以标准形式输出。一开始最大的问题就是对于正则表达式并不会使用,在学习了一段时间后,开始尝试写发现网页版上测试的正则表达式在java代码里实现的并不太一样。正则表达式的学习上的一些难度导致一直没有太大的进展,分离多项式的每一项需要讨论好几种不同的情况,例如某一项不含系数或者指数,某一项是常数项等等。一开始在思路上一直有问题,最后截止了才想起来可以使用的循环方法,希望下一次这道类似的题目和我可以作出改进,好好梳理一下自己的思路。正则表达式,ArrayList数组,需要去熟练使用,题目才可能做出来。另外,这道题,是需要巧妙使用类的,我没有去用到,对于类的使用还不是很会,这是需要着重学习的一个点。
考虑到一些问题,至今还没有办法很好的解决,例如某一项系数为1,暂时只能做到1*x的筛选;对于测试用例中的输入用例3,一直没有成功的匹配最后一项;测试用例中有一个大数测试的点,也不能够通过。
目前有认真在CSDN和B站中研读博主的经验,进一步学习类的使用和正则表达式,希望下一次作业不会无从下手,至少能写出一个明确的框架。
Pattern pattern111 = Pattern.compile("([+-]?^0)|(\\^0)|(0\\*)(.*)");
Matcher matcher111 = pattern111.matcher(fx);
if(matcher111.find())
{
System.out.println("Wrong Format");
System.exit(0);
}
该处是筛选多项式是否是非法输入,该处细节多,一开始并不是使用这种语句,后来发现这种更方便,筛选出来更准确。
public static int num(String str, char c) {
int n = 0;
char[] charArray = str.toCharArray();
for (char item : charArray) {
if (item == c)
n++;
}
return n;
}
该处原本思路是查找多项式中的x的数量以确定多项式的项数,最后不知道如何使用。
二、心得
在java编译器上写代码再到PTA上提交,需要做出改动,例如不同类如何在同一.java文件中;再者面向对象的思维能力确实不够有待提升;虽然第三次题目集分数不怎么理想,但希望在这次题目集以后,吸取教训,下一次题目集不踩同样的坑,在代码上少走弯路,做到精简代码,语句不繁琐。另外在方法的使用上不够熟练,很多方法并不知道,每次做题时,方法都需要边查边做,希望可以有所改进,做到不看书不查资料能完整的写完一道题。
在编译器上,我其实大部分时候用的都是IDEA,虽然老师说大部分公司主张用的还是eclipse,但我在这么多次使用过程下来,IDEA在使用感受上非常好,对于初学者不是很了解的人来说,用起来可能会比较方便。