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
正则表达式