继上一篇博客之后,求第三个数有可以进行进一步的优化,面试官看过之后,又给了我一些点评,再次感激不尽,说我的程序可以再一次优化,用一个for循环就可以搞定。ok,既然有这样的需求,那么下面我们就用一个for循环,将其搞定。
首先当时我正在河南的家中,陪家人看电视,收到面试官的短信之后,立刻打开电脑,用老家跟蜗牛似的3G上网卡,写下了这一篇博客,因为网速很慢,原本已经写好的东西,当保存的时候,突然没有网络,当我重新刷新这个页面的时候,原先写的东西已经不复存在。好吧,下面将我的心路历程分享给大家。
package com.yting.hadoop.rpc; /** * 第三大数优化 * @author zhengyunfei * @date 2014-04-18 * */ public class ThirdData { public static void main(String[] args) { int a[] = new int[100000]; for(int i=0;i<100000;i++){ a[i]=i; } long pre=System.currentTimeMillis(); int result=getThirdNum(a); long last=System.currentTimeMillis(); long time=last-pre; System.out.print("第三大数:"+result+" 耗时:"+time+"毫秒"); } public static int getThirdNum(int[] a) { //首页定义三个变量; int maxNum=0;//第一大数 int secondNum=0;//第二大数 int thirdNum=0;//第三大数 //其次将三个数放到一位数组array中 int array []={a[0],a[1],a[2]}; //接下来比较这三个数的小 maxNum=getSortData(1,array); secondNum=getSortData(2,array); thirdNum=getSortData(3,array); //将这三个数,按照从大到小的顺序 重新放到一位数组array当中 array[0]=maxNum; array[1]=secondNum; array[2]=thirdNum; int length = a.length;//数组的长度 for (int i = 3; i < length; i++) { if (a[i] >thirdNum)//如果数组a当中有比array[3]大的数,证明array[3]不是第三大的数 { secondNum=a[i];//将数组array中第三大数array[2],替换成a[i] array[2]=secondNum; //将新添加来的a[i]与数组array当中原有的array[0],array[1]重新比较大小,求最大值,第二大值,第三大值 maxNum=getSortData(1,array); secondNum=getSortData(2,array); thirdNum=getSortData(3,array); //求出值后,再将这三个数,重新按照从大到小的顺序,放到数组array当中 array[0]=maxNum; array[1]=secondNum; array[2]=thirdNum; } } return thirdNum;//返回第三大数 } /** * 求长度为3的数组当中,第一大,第二大,第三大数分别是多少 * @author zhengyunfei * @date 2014-04-18 * @param i index * @param array 书组名称 * @return */ public static int getSortData(int i,int array[]){ int a=array[0],b=array[1],c=array[2]; if(i==1){ return a>b && a>c?a:(b>c?b:c);//最大值 }else if(i==2){ return a>b && a<c||a<b&&a>c?a:(a<b&&a<c?(b>c?c:b):(b>c?b:c));//第二大值 } else { return a<b && a<c?a:(b<c?b:c); //第三大值 } } }
10万个数,求第三大数,运行结果如下:
第三大数:99997 耗时:8毫秒
感觉上面的程序有一些是重复型的代码,所以,下面我需要对上面的代码进行方法的重构,重构后的代码如下:
package com.yting.hadoop.rpc; /** * 第三大数优化 * @author zhengyunfei * @date 2014-04-18 * */ public class GetThirdData { public static void main(String[] args) { int a[] = new int[100000]; for(int i=0;i<100000;i++){ a[i]=i; } long pre=System.currentTimeMillis(); int result=getThirdNum(a); long last=System.currentTimeMillis(); long time=last-pre; System.out.print("第三大数:"+result+" 耗时:"+time+"毫秒"); } public static int getThirdNum(int[] a) { //首页定义三个变量; int maxNum=0;//第一大数 int secondNum=0;//第二大数 int thirdNum=0;//第三大数 //其次将三个数放到一位数组array中 int array []={a[0],a[1],a[2]}; thirdNum = getSortArray(array); int length = a.length;//数组的长度 for (int i = 3; i < length; i++) { if (a[i] >thirdNum)//如果数组a当中有比array[3]大的数,证明array[3]不是第三大的数 { secondNum=a[i];//将数组array中第三大数array[2],替换成a[i] array[2]=secondNum; thirdNum = getSortArray(array); } } return thirdNum;//返回第三大数 } /** * 重构第三个数 * @author zhengyunfei * @date 2014-04-18 * @param array 数组名称 * @return */ private static int getSortArray(int[] array) { int maxNum; int secondNum; int thirdNum; //接下来比较这三个数的小 maxNum=getSortData(1,array); secondNum=getSortData(2,array); thirdNum=getSortData(3,array); //将这三个数,按照从大到小的顺序 重新放到一位数组array当中 array[0]=maxNum; array[1]=secondNum; array[2]=thirdNum; return thirdNum; } /** * 求长度为3的数组当中,第一大,第二大,第三大数分别是多少 * @author zhengyunfei * @date 2014-04-18 * @param i index * @param array 书组名称 * @return */ private static int getSortData(int i,int array[]){ int a=array[0],b=array[1],c=array[2]; if(i==1){ return a>b && a>c?a:(b>c?b:c);//最大值 }else if(i==2){ return a>b && a<c||a<b&&a>c?a:(a<b&&a<c?(b>c?c:b):(b>c?b:c));//第二大值 } else { return a<b && a<c?a:(b<c?b:c); //第三大值 } } }
同样重构后的程序运行结果也是:
第三大数:99997 耗时:10毫秒,由于具有误差,运行结果的耗时可能会存在一些细微的差异,这是正常的。
我的下一篇博客,将继续对求第三大数进行深入探究,将求第三大数,换成求第k大数,尽情期待。。。
下一篇深入探究第k大数,已经写好,地址:http://zhengyunfei.iteye.com/blog/2049087
至此,针对求第三大数的算法,我已经写了5篇博客,从前之后以此为:
第一篇:初写求第三大数算法
第二篇:优化求第三大数算法
第三篇:深入探究第三大数
第四篇:深入探究第K大数
第五篇:深入探究N个数组的第K大数
相关推荐
首先,在专题一“大数的认识”中,学生将会花上3个课时的时间,从基础的读写规则开始,深入探索大数的奥秘。孩子们首先会学习如何正确地书写和读出亿级别的大数,理解计数单位“万”、“十万”、“百万”、“千万”...
第三,教师需要通过实际情境,使学生理解大数在现实生活中的应用,使学生意识到数学知识与生活的紧密联系。例如,可以利用天文学的数据来展示如何将大数改写为更加直观的单位,或者用日常生活中可以触及的计量,如...
在北师大版的《2020春二年级数学下册》中,第三单元“生活中的大数”第九课时的练习二教案,是以培养二年级学生对于大数概念的熟悉度与理解能力为目标的一次教学活动。本教案详细规划了教学活动的各个阶段,从联系...
本课程的第一课时“数一数(一)”是引入学生认识“千”这一大数计数单位的基础环节,对于学生构建十进制概念至关重要。本篇文章将深入解析该课时的教案内容,详细探讨教学目标、重难点、教学过程设计及其预期的教学...
第三部分是小结与课堂练习,教师要总结比较数大小的步骤,并通过实际操作来加深学生的理解。例如,在数线上标出一个具体数值的位置,让学生通过操作感受数的位置和大小关系。这一环节旨在帮助学生将理论知识转化为...
课后答案不仅为学生提供了检验学习成果的途径,也是自我学习与深入探究的重要工具。学生通过比对答案,能够及时发现自身的不足,从而有针对性地加强练习。同时,解答过程中的逻辑推理与论证也是锻炼学生逻辑思维与...
#### 第3章 中心极限定理的相关计算及证明 ##### 3.1 中心极限定理的相关计算 本节通过具体的数学模型和实例,展示了如何利用中心极限定理来计算样本均值落在某个区间内的概率。这些计算对于理解和验证中心极限...
甘肃省武威市第十七中学2014届九年级数学下学期第三次月考试题的解析与探究 引言: 在甘肃省武威市第十七中学的数学教学体系中,九年级的学生已经进入了深入学习数学知识的阶段。为了检测学生对所学知识的掌握程度...
第三部分涉及使用计算器探索数学规律。在面对大数运算时,计算器成为重要的工具,让学生通过观察、计算和交流,体验到计算器在发现和验证数学规律时的作用。通过计算器的使用,学生可以更深入地理解和掌握大数的乘法...
3. 探究新知:通过展示三国的具体数据,引导学生探讨比较万以上数的方法,让学生理解万以内数的比较规律同样适用于大数。同时,引导学生发现并总结将数改写为“万”单位的规则,即去掉万位后的四个零,加上“万”字...
在具体教学内容方面,第一单元《大数的认识》是本册教材的重点。这个单元涵盖了“亿以内数”和“亿以上数”的认识,涉及到计数单位如“万”、“十万”、“百万”、“千万”和“亿”,以及数级和单位之间的十进制关系...
3. **第三章:随机变量及其分布**:这里主要讲解离散随机变量和连续随机变量,包括均匀分布、二项分布、泊松分布、正态分布等常见分布。掌握随机变量的分布特征是后续学习的基础。 4. **第四章:多维随机变量**:这...
第三题则是对同类项定义的考察,要求学生从数学表达式中找出同类项,这需要学生对同类项的概念有清晰的认识。而第四题和第五题则涉及基本的算术运算规则,如减去一个负数等于加上它的正数,以及对等式性质的掌握。...
通过上述分析,我们可以看出,这个单元的教学旨在培养学生对大数的深入理解,提高他们的数感和运算能力,同时通过情境教学和自主探究,促进学生的思维发展和学习自主性。在教学过程中,教师不仅关注知识的传授,也...
此外,基本概率事件(第3题)、几何体的视图(第4题)等题目,都是以实用性和直观性为基础,考察学生的逻辑思维和应用能力。 填空题部分则更加注重对学生综合运用知识能力的考核。科学记数法的应用(第9题)是对...
**第一单元:大数的认识** 本单元主要涉及亿以内数、亿以上数的认识,以及数的产生和十进制计数法。以下是该单元的具体编排和主要变化: - **亿以内数的认识**:通过实例让学生初步感知大数,并理解大数在现实生活...
《不等关系与不等式的应用探析》 在数学领域,不等关系与不等式是基础且重要的概念,它们广泛应用于各种实际问题中,如...通过持续的练习和深入探究,我们可以更好地运用这些知识,解决生活和工作中遇到的各类挑战。
而第7题则是对相似三角形比例关系的深入探究,这对于学生掌握图形的相似原理有着重要作用。 填空题部分同样精彩纷呈,10道题目不仅涉及了数学基础知识的巩固,还包括了一些对基本概念的深化理解。例如,第11题让...
用三步口决可以简单概括均值不等式的核心:大数除以小数,结果不小于平均数,等号成立当且仅当所有数相等。 均值不等式的常见形式如下: 1. 对于任意正数a和b,有a+b≥2√(ab),等号成立当且仅当a=b。 2. 同样,ab...
第3题通过比较足球的质量,让考生理解如何接近标准值,选项C.-0.6是正确答案,这不仅测试了学生的数学运算能力,同时也考察了他们的生活常识。 填空题共有10题,这部分的题目难度逐步加深,要求学生不仅要掌握数的...