Bolg1

(1)前言:总结三次题目集的知识点、题量、难度等情况

  第一次题目集

  1,计算两个数的和----数据的输入及运算

  2,电话键盘字母数字转换----数字与字符的相互转化,以及数据合法性检验

  3,成绩分级管理 ----java中选择语句的运用

  4,计算税率----java中选择语句的运用

  5,计算钱币----数据运算

  6,使用一维数组求平均值----数组的用法

  7,对多个整数进行排序----对一维数组进行排序

  8,判断三角形类型----double类型转化为int型,产生误差

 

  难度分析:第一次题目集,较为简单,已经经过C语言的学习,java中很多语法都与之相似。

 

  第二次题目集

  1,IP地址转换 ----二进制转化为十进制

  2,合并两个有序数组为新的有序数组 ----合并数组并排序

  3,判断闰年及星期几----合理使用数组代替if

  4,求下一天----对方法的调用

  5,求前N天----合理利用数组及方法

 

  难度分析:第二次题目集,并不难,并且该题目集中,后4题都十分类似。在合理利用数组的情况下,并没有非常大的问题。

 

  第三次题目集

  1,创建账户类Account ----类的创建及使用、类中方法的调用

  2,定义日期类----类的创建及使用、类中方法的调用

  3,一元多项式求导(类设计)----字符串的处理(截取、连接)

 

  难度分析:第三次题目集,前两题只是增加了一个对类的处理,较为简单。

       最后一题,考察的是对字符串的处理,很多高效的方法没有掌握熟练(正则表达式、split方法),因此该题对我而言十分吃力。


(2)设计与分析:

7-8判断三角形类型

  因为初期没有学习关于类的知识,此题没有使用到类

  此题在对三个数比较大小时,我使用for循环和if,并且后续还使用if判断三角形的类型(可以改进使用switch),导致复杂度太高。

  另外,没有写注释,也没有使用方法,直接在Main方法中写完代码。

 

SourceMonitor的报表:

  

 

7-4 求下一天

  此题也没有使用到类。

  该题是求日期的下一天,因此要考虑的问题就包括数据的合法,以及跨年、跨月、闰年。均使用if判断语句解决。

  将各月份的天数存入数组,更为简便,在数组中将月份+1,即可得到该月对应天数。省去了每月份都用if判断,提高效率。

 SourceMonitor的报表:

 

 

7-5 求前N天

  没有使用类

  该题完全可以借鉴上一题7-4求下一天,将方法nextDate(),多传入一个参数n。

将day++   改为day-=n

  与上题类似,将各月份的天数存入数组,便于使用。

 SourceMonitor的报表:

 

7-2  定义日期类

  该题主要是要理解对类的使用,而非前面题目集中,直接调用方法解决问题。

  借鉴7-4中求下一天的方法,将年月日作为日期的私有属性,将输入的信息参数传入类中,再在类中调用方法,输入结果。

  复杂度与7-4类似,但使用类,做到了对数据的保护。

类图

 

 SourceMonitor的报表:

 

7-3  一元多项式求导(类设计)

     没有使用类

  通篇使用if、for循环,导致复杂度太高,变成垃圾代码。

  首先,拆分每一项,我是用if依次对每个字符进行判断后截取,完全可以用正则表达式或split的方法代替,因为掌握不熟练,没有使用。因此复杂度极高。

  提取每一项的系数及指数,也是使用if判断后,提取字符,然后转化为int型,再进行求导运算。同样也可用正则表达式或split的方法代替,减少复杂度。

  对于每一项,可以创建一个类来储存,因为对类的使用不熟练,而没有使用。

SourceMonitor的报表:

  

 

 


(3)采坑心得:                                         

 

  第一次题目集最后一题判断三角形类型中,涉及到根号的运算(判断等腰直角三角形,斜边为腰长的√2倍),此时在计算机中,就应考虑到误差值,从而不能用

1    if( max*max==mid*mid+min*min ) 

  而应改为

1     if( max*max-(mid*mid+min*min)<1e-5 )

                                                                                                                                                                                                         

(4)改进建议 :

 

  第一次题目集中最后一题--判断三角形类型,对三角形三条边比较大小,我使用for循环一个一个比较 非常复杂,且效率极低

1   double min=a[0],max=a[0],mid=a[0];
2         for(i=0;i<3;i++) {
3             if(a[i]>max) max=a[i];
4             if(a[i]<min) min=a[i];
5             num=num+a[i];
6         }
7         mid=num-max-min;

  对此,可以用Java中的Math类进行快速比较,

  改进代码

1     double max,min,mid;
2         max=Math.max(Math.max(a[0],a[1]), a[2]);
3         min=Math.min(Math.min(a[0], a[1]), a[2]);
4         mid=a[0]+a[1]+a[2]-max-min;

                                                                                                                                                                                                                                                                                                                                                            

 

  第二次题目集 第一题 IP地址转换,对八位二进制数字转化为十进制。

  我从后往前,依次求出各个二进制所对应的十进制数后,相加。每次循环都进行了if判断,且还调用了Math类中的方法,增加了复杂度

1         for(i=7;i>=0;i--) {
2             if(a[i]==1) {
3                 num1+=Math.pow(2, j);
4             }
5             j++;
6         }       

  改进代码

  因为二进制中只有0和1,完全可以减少if语句的判断,减低复杂度。

1     for(i=0;i<8;i++) {
2                 num=num*2+a[i]; 
3         }

                                                                                                                                                                                                                                                                                                                                                                                                                                 

  第二次题目集 第二题 合并两个有序数组为新的有序数组 

  将两个数组合并后,排序的问题。

  当时是使用C语言中的冒泡排序解决

1       for(i=0;i<c.length-1;i++) {
2             for(j=0;j<c.length-i-1;j++) {
3                 if(c[j]>c[j+1]) {
4                     t=c[j];
5                     c[j]=c[j+1];
6                     c[j+1]=t;
7                 }
8         }
9 }

 

  学到Arrays类后,直接使用Arrays中的方法,对数组c排序。

1 Arrays.sort(c);

 

(5)总结: 

  学到了什么:

  顺序、选择、循环、方法(函数)在java中的使用。

  了解复杂度的概念,尽量减少使用if,以及加注释,增加程序可维护性。

  对字符串的处理,字符串的连接、截取。

 

  需要进一步学习及研究

   BigInteger的使用(当整型数据超过了整数的最大类型长度long的话,数据无法装入,因此要使用BigInteger类进行操作)

  对类的使用(创建、调用)极其不熟练

  java中的链表 Linked list  

  正则表达式

 

posted @ 2021-04-04 19:29  见到  阅读(70)  评论(0编辑  收藏  举报