首先感谢面试官,看了我的博客,并认真读了我的博客,并针对求第三大数的算法,给出了我宝贵的建议;
对于我来说,这样才有有意,这样学习才能成长,这样进步才能更快;
首先题目很简单,就是求若干个数中第三个数是多少?我第一次写的程序如下:
package test; /** * @title 求一个数组中第三大数是多少 * @author 郑云飞 * @date 2014-04-13 * */ public class ArrayDemo{ public static void main(String[] args){ int arr[]={1,3,5,7,23,122,2344}; int x=show(arr); System.out.println("第三大数="+x); } /** * @author 郑云飞 * @date 2014-04-13 * @param arr 数组 * @return 第三大数 */ public static int show(int arr[]){ for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ temp(arr,i,j);//交换位置 } } } return arr[arr.length-3]; } /** * @title 交换位置 * @param arr 数组名 * @param a 参数a * @param b 参数b */ public static void temp(int arr[],int a,int b){ int t=arr[a]; arr[a]=arr[b]; arr[b]=t; } }
面试官看过之后说:我的代码是先排序再找出第三大数,效率不是很高,让我继续琢磨一下,并给了我温馨提示:说并不需要全体排序就能找出来。
看过短信之后,我首先回忆了一下,当初在凤凰汇咖啡厅的时候,面试官曾经给了我暗示。我按照他当初给我的提示,反复思考着,最后想到了用冒泡排序实现升序的过程,只执行三次排查即可,第三大的数会排到倒数第3位的位置,改进后的代码如下:
package com.yting.hadoop.rpc; /** * @title 求一个数组中第三大数是多少 * @author 郑云飞 * @date 2014-04-16 * */ public class ArrayDemo { public static void main(String[] args) { int a[]={10,9,8,7,6,5,4,3,2,1};//随便定义一个数组,并初始化 int i,j; //用冒泡排序实现升序的过程,只执行三次排查即可,第三大的数会排到倒数第3位的位置 for(i=0;i<3;i++) { for(j=0;j<10-i-1;j++) { if(a[j]>a[j+1]) { temp(a,j,j+1); } } } System.out.print("最三大数:"+a[7]); } /** * 交换位置 * @author zhengYunfei * @date 2014-04-16 * @param arr 数组名 * @param a 参数a * @param b 参数b */ public static void temp(int arr[],int a,int b){ int t=arr[a]; arr[a]=arr[b]; arr[b]=t; } }
下面就来算算这2个程序运行时间,看看到底哪个效率更高
首先我们定义一个10000个数的一位数组
int a[] = new int[10000]; for(int i=0;i<10000;i++){ a[i]=i; }
用第一个程序:
package com.yting.hadoop.rpc; /** * @title 求一个数组中第三大数是多少 * @author 郑云飞 * @date 2014-04-13 * */ public class ArrayDemo2{ public static void main(String[] args){ long pre=System.currentTimeMillis(); int arr[] = new int[10000]; for(int i=0;i<10000;i++){ arr[i]=i; } int x=show(arr); long last=System.currentTimeMillis(); long time=last-pre; System.out.println("第三大数="+x+"\t"+"耗时:"+time+"毫秒"); } /** * @author 郑云飞 * @date 2014-04-13 * @param arr 数组 * @return 第三大数 */ public static int show(int arr[]){ for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ temp(arr,i,j);//交换位置 } } } return arr[arr.length-3]; } /** * @title 交换位置 * @param arr 数组名 * @param a 参数a * @param b 参数b */ public static void temp(int arr[],int a,int b){ int t=arr[a]; arr[a]=arr[b]; arr[b]=t; } }
运行结果如下:
第三大数=9997 耗时:85毫秒
改进后的程序:
package com.yting.hadoop.rpc; /** * @title 求一个数组中第三大数是多少 * @author 郑云飞 * @date 2014-04-16 * */ public class ArrayDemo { public static void main(String[] args) { long pre=System.currentTimeMillis(); int a[] = new int[10000]; for(int i=0;i<10000;i++){ a[i]=i; } int i,j; //用冒泡排序实现升序的过程,只执行三次排查即可,第三大的数会排到倒数第3位的位置 for(i=0;i<3;i++) { for(j=0;j<10000-i-1;j++) { if(a[j]>a[j+1]) { temp(a,j,j+1); } } } long last=System.currentTimeMillis(); long time=last-pre; System.out.println("10000个数中第三大数是"+a[10000-3]+"\t耗时:"+time+"毫秒"); } /** * 交换位置 * @author zhengYunfei * @date 2014-04-16 * @param arr 数组名 * @param a 参数a * @param b 参数b */ public static void temp(int arr[],int a,int b){ int t=arr[a]; arr[a]=arr[b]; arr[b]=t; } }
运行结果如下:
10000个数中第三大数是9997 耗时:1毫秒
再将数组提升到100000个,前者耗时:
第三大数=99997 耗时:13906毫秒
改进后的程序耗时:
100000个数中第三大数是99997 耗时:7毫秒
数组个数越大,2者的差别越明显。
所以执行同样的结果,不同的算法,执行的效率相差真的很大,所以,编程当中优化算法,优化执行效率,才是编程之美。
再次感谢面试官,让我对这个程序进行了更深层次的研究。还希望请您再阅读一下,看看有没有更好的更有效率的算法,尽情期待。
优化后的算法,请看紧跟此博客其后的下一篇博客:深入探究第3大数
相关推荐
21届的福建电信面试流程
参加编写工作的人员必须通过中国电信集团的笔试和面试。 规范编写组正式入驻北京顺义望潮苑度假村,为了编写工作的顺利开展,同时也为了知识产权的控制,编写组特别租赁了30-40台机器用于编写工作,参与人员所携带...
### 中国电信笔试面试资料知识点概览 #### 一、应届生求职网与中国电信的关系 - **应届生求职网**(YingJieSheng.COM)成立于2005年9月,作为中国流量第一的面向大学生及在校生的求职招聘网站,它为用户提供最新的...
中国电信笔试面试资料集合,包含各种资料(IT类的)
"中国电信面试经验分享" 标题分析 从标题“中国电信面试经验分享”可以看出,这篇文章旨在分享作者在中国电信的面试经验。作者通过分享自己的面试经历,希望能够帮助其他应聘者更好地准备面试,提高面试的成功率。 ...
2013年最新版中国电信测试面试题题库,内容全面广泛深刻
- **目的**:该大礼包旨在为2010年的应届毕业生提供中国电信公司的求职指南,帮助他们更好地准备面试。 - **来源**:由应届生求职网YingJieSheng.COM编制,该网站是中国领先的面向大学生及在校生的求职招聘网站。 #...
### 中国电信笔试面试知识点解析 #### 一、公司概况与文化 **中国电信**作为中国领先的综合信息服务提供商之一,其主营业务涵盖了固定电话、移动通信、互联网接入和服务等多个领域。公司在不断的发展过程中,形成...
**知识点生成:中国电信面试宝典** 中国电信作为中国领先的通信服务提供商,在全球范围内享有盛誉,其业务涵盖了固定电话、移动通信、互联网接入及多种综合信息服务。对于即将步入职场的大学生而言,中国电信不仅...
中国电信作为中国三大主要电信运营商之一,其笔试和面试环节对于应聘者来说至关重要。这份"中国电信笔试面试必知的资料"包含的2010年应届生求职大礼包,是针对想要进入电信行业的应届毕业生的一份宝贵资源。下面将...
中国电信作为中国三大主要电信运营商之一,其笔试和面试流程对于求职者来说是非常关键的环节。这份"中国电信笔试和面试相关资料.rar"压缩包文件显然包含了丰富的备考资源,旨在帮助有意加入该公司的求职者做好充分...
### 中国电信交换专业基础知识 #### 异步传输模式(ATM) 异步传输模式(ATM)是一项革命性的数据传输技术,它结合了电路交换和分组交换的优点,旨在革新计算机网络架构。ATM基于异步时分复用原理,采用固定长度的...
### 中国电信应届生求职大礼包知识点概览 #### 一、公司概况 **中国电信集团公司**是中国一家特大型国有通信企业,也是中国最大的综合信息服务提供商。它拥有全球最大的固定电话网络和中文信息网,网络覆盖全国...
- 笔试和面试中常常包含英语测试,复习资料会提供英语阅读、写作、听力和口语的相关训练。 - 资料中可能包括词汇表、语法讲解、模拟题和实战演练等。 4. **知识点笔记**: - 这些笔记整理了通信行业的关键概念、...
中国电信作为中国三大主要电信运营商之一,其笔试环节对于求职者来说是至关重要的。这份"中国电信笔试题(含非官方答案)"文档很可能包含了多种类型的题目,包括但不限于通信技术、网络技术、计算机基础知识、市场营销...
中国电信财务管理岗笔试题及面试题 中国电信财务管理岗笔试题及面试题 中国电信财务管理岗笔试题及面试题
【知识点详解】 1. 计算机网络分类: - 广域网(WAN):覆盖远程区域,是互联网的核心部分,具有高速度和大范围的特点。...这些内容对于理解网络原理和设计至关重要,也是中国电信笔试计算机岗位的常见考点。
### 中国电信求职培训知识点 #### 一、公司概况 **公司背景:** 中国电信集团公司作为按照国家电信体制改革方案组建的特大型国有通信企业,是中国最大的基础网络运营商,拥有全球第一大的固定电话网络。其业务覆盖...