继上一篇博客之后,求第三个数有可以进行进一步的优化,面试官看过之后,又给了我一些点评,再次感激不尽,说我的程序可以再一次优化,用一个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大数
相关推荐
大数计算器大数计算器大数计算器大数计算器
大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律大数定律...
ACM大数模版ACM大数模版ACM大数模版ACM大数模版ACM大数模版ACM大数模版ACM大数模版ACM大数模版
用C++写的重载的大数模板 大数加法、大数乘法、大数除法、大数减法 带有注释
分享一下用C/C++实现的大数相加和大数相乘,可以拿来当工具用。
大数相乘大数相加大数阶乘代码 完全解决代码简易 容易理解 有什么缺点欢迎评论 交流
示例 1:输入: [3, 2, 1]输出: 1解释: 第三大的数是 1.示例 2:输入: [1, 2]输出: 2解释: 第三大的数不存在, 所以返回最大的数 2
计算 大数加大数 大数减大数 大数乘大数 大数乘小数 小数阶乘 数组处理
高精度算法,包括大数加法,大数减法,大数乘法,大数除法,大数取余等高精度算法
C++实现大数加减乘数
大数相乘大数相乘大数相乘大数相乘大数相乘
素数判定与大数分解问题在数论中占有重要地位,远古时代人们就十分重视它的研究,近年来,由于计算机科学的发展,使这一古老的问题焕发了青春,形成了数论中的新分支——计算数论,《<数学中的小问题大定理>丛书(第...
c++大数类,重载了全部运算符,很详细
本文叙述了GMP大数库的帮助文档,详细介绍了GMP大数库的各种运算
冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。...然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束
大数运算 RSA c语言大数运算库 英文PDf 中文PDF 源码
C语言无符号整形的大数加法和乘除法的源代码,自己编译通过,并且加有自己理解的注释!大数除法.cpp 大数乘法.cpp 大数加法.cpp
大数计算类.cpp
能够进行大数处理,将大数转换成数组输入输出,从而实现大数的除法运算
n! 大数的阶乘 c++ n! 大数的阶乘 cn! 大数的阶乘 c++++