【计算机类职业资格】(Java)程序员面试-16及答案解析.doc
《【计算机类职业资格】(Java)程序员面试-16及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】(Java)程序员面试-16及答案解析.doc(41页珍藏版)》请在麦多课文档分享上搜索。
1、(Java)程序员面试-16 及答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:29,分数:100.00)1.如何找出数组中重复元素最多的数 (分数:3.50)_2.如何求数组中两两相加等于 20 的组合种数 (分数:3.50)_3.如何把一个数组循环右移 k 位 (分数:3.50)_4.如何找出数组中第 k 个最小的数 (分数:3.50)_5.如何找出数组中只出现一次的数字 (分数:3.50)_6.如何找出数组中唯一的重复元素 (分数:3.50)_7.如何用递归方法求一个整数数组的最大元素 (分数:3.50)_8.如何求数对之差的最大值 (分数:3.50)_9.如何求
2、绝对值最小的数 (分数:3.50)_10.如何求数组中两个元素的最小距离 (分数:3.50)_11.如何求指定数字在数组中第一次出现的位置 (分数:3.50)_12.如何对数组的两个子有序段进行合并 (分数:3.50)_13.如何计算两个有序整型数组的交集 (分数:3.50)_14.如何判断一个数组中数值是否连续相邻 (分数:3.50)_15.如何求解数组中反序对的个数 (分数:3.50)_16.如何求解最小三元组距离 (分数:3.50)_17.如何实现字符串的反转 (分数:3.50)_18.如何判断两个字符串是否由相同的字符组成 (分数:3.50)_19.如何删除字符串中重复的字符 (分数:
3、3.50)_20.如何统计一行字符中有多少个单同 (分数:3.50)_21.如何按要求打印数组的排列情况 (分数:3.50)_22.如何输出字符串的所有组合 (分数:3.50)_23.二叉树基本概念 (分数:3.50)_24.如何实现二叉排序树 (分数:3.50)_25.如何层序遍历二叉树 (分数:3.50)_26.已知先序遍历和中序遍历,如何求后序遍历 (分数:3.50)_27.如何求二叉树中结点的最大距离 (分数:3.00)_28.如何消除嵌套的括号 (分数:3.00)_29.如何不使用比较运算就可以求出两个数的最大值与最小值 (分数:3.00)_(Java)程序员面试-16 答案解析(总
4、分:100.00,做题时间:90 分钟)一、论述题(总题数:29,分数:100.00)1.如何找出数组中重复元素最多的数 (分数:3.50)_正确答案:()解析:问题描述:对于数组1,1,2,2,4,4,4,4,5,5,6,6,6,元素 1 出现的次数为 2 次,元素 2 出现的次数为 2 次,元素 4 出现的次数为 4 次,元素 5 出现的次数为 2 次,元素 6 出现的次数为 3 次,找出数组中出现重复次数最多的数。 上述问题中,程序的输出应该为元素 4。 可以采取如下两种方法来计算数组中重复次数最多的数。 方法一:空间换时间。可以定义一个数组 int countMAX,并将其数组元素都初
5、始化为 0,然后执行for(int i=0; i100; i+)countAi+操作,在 count 数组中找最大的数,即为重复次数最多的数。这是一种典型的空间换时间的算法。一般情况下,除非内存空间足够大,一般不采用这种方法。 方法二:使用 Map 映射表。通过引入 Map 映射表(Map 提供一对一的数据处理能力,其中第一个为关键字,每个关键字只能在 Map 中出现一次,第二个称为该关键字的值)来记录每一个元素出现的次数,然后判断次数大小,进而找出重复次数最多的元素。示例如下: import java.util.*; public class Test public static int f
6、indMostFrequentInArray(inta) int result=0; int size=a.length; if(size=0) return Integer.MAX_VALUE; /记录每个元素出现的次数 MapInteger, Integerm=new HashMapInteger, Integer(); for(int i=0; isize; i+) if(m.containsKey(ai) m.put(ai, m.get(ai)+1); else m.put(ai, 1); /找出出现次数最多的元素 int most=0; Iterator iter=m.entrySe
7、t().iterator(); while(iter.hasNext() Map.Entry entry=(Map.Entry)iter.next(); int key=(Integer)entry.getKey(); int val=(Integer)entry.getValue(); if(valmost) result=key; most=val; return result; public static void main(Stnngargs) int array=1, 5, 4, 3, 4, 4, 5, 4, 5, 5, 6, 6, 6, 6, 6; int maxFrequence
8、Num=findMostFrequentInArray(array); System.out.println(maxFrequenceNum); 程序运行结果为: 62.如何求数组中两两相加等于 20 的组合种数 (分数:3.50)_正确答案:()解析:问题描述:给定一个数组1,7,17,2,6,3,14,这个数组中满足条件的有两对组合17+3=20 和 6+14=20。 方法一:“蛮力”法 最容易想到的方法就是采用两重循环遍历数组来判断两个数的和是否为 20。实现代码如下: public class Test public static void findSum(inta, int sum)
9、 int len=a.length; for(int i=0; ilen; i+) for(int j=i; jlen; j+) if(ai+aj=sum) System.out.println(ai+“, “+aj); public static void main(Stringargs) int array=1, 7, 17, 2, 6, 3, 14; findSum(array, 20); 程序运行结果为: 17, 3 6, 14 由于采用了双重循环,因此这个算法的时间复杂度为 O(n2)。 方法二:排序法 先对数组元素进行排序,可以选用堆排序或快速排序,此时算法的时间复杂度为 O(nl
10、ogn),然后对排序后的数组分别从前到后和从后到前遍历,假设从前往后遍历的下标为 begin,从后往前遍历的下标为end,那么当满足 arrbegin+arrend20 时,如果存在两个数的和为 20,那么这两个数一定在begin+1,end之间;当满足 arrbegin+arrend20 时,如果存在两个数的和为 20,那么这两个数一定在begin,end+1之间。这个过程的时间复杂度为 O(n),因此整个算法的时间复杂度为 O(nlogn)。实现代码如下: import java.util.Arrays; public class Test public static void findS
11、um(inta, int sum) Arrays.sort(a); int begin=0; int end=a.length-1; while(beginend) if(abegin+aendsum) begin+; else if(abegin+aendsum) end-; else System.out.println(abegin+“, “+aend); begin+; end-; public static void main(Stringargs) int array=1, 7, 17, 2, 6, 3, 14; findSum(array, 20); 程序运行结果为: 3, 17
12、 6, 14 这个算法的时间复杂度主要由排序算法的时间复杂度来决定。因此,选择时间复杂度较低的排序算法能显著提高该算法的效率。3.如何把一个数组循环右移 k 位 (分数:3.50)_正确答案:()解析:假设要把数组序列 12345678 右移 2 位变为 78123456,比较移位前后数组序列的形式,不难看出,其中有两段序列的顺序是不变的,即 78 和 123456,可以把这两段看作两个整体,右移 k 位就是把数组的两部分交换一下。鉴于此,可以设计这样一种算法,步骤如下(以数组序列 12345678 为例): 1)逆序数组子序列 123456,数组序列的形式变为 65432178。 2)逆序数
13、组子序列 78,数组序列的形式变为 65432187。 3)全部逆序,数组序列的形式变为 78123456。 程序代码如下: public class Test public static void reverse(int a, int b, int e) for(; be; b+, e-) int temp=ae; ae=ab; ab=temp; public static void shift_k(int a, int k) int n=a.length; k=k%n;/为了防止 k 比 n 大,右移 k 位跟右移 k%n 位的结果是一样的 reverse(a, n-k, n-1); re
14、verse(a, 0, n-k-1); reverse(a, 0, n-1); public staric void main(Stringargs) int array=1, 2, 3, 4, 5, 6, 7, 8; shift_k(array, 2); for(int i=0; iarray.length; i+) System.out.print(arrayi+“); 程序运行结果如下: 7 8 1 2 3 4 5 6 从上例中可以看出,该算法只进行了 3 次逆序操作,因此时间复杂度为 O(n)。4.如何找出数组中第 k 个最小的数 (分数:3.50)_正确答案:()解析:问题描述:给定
15、一个无序的数组,从一个数组中找出第 k 个最小的数,例如,对于给定数组序列1,5,2,6,8,0,6,其中第 4 小的数为 5。 方法一:排序法 最容易想到的方法就是对数组进行排序,排序后的数组中第 k-1 个位置上的数字即为数组的第 k 个最小的数(原因是数组下标从 0 开始计数),这种方法最好的时间复杂度为 O(nlogn)。 方法二:“剪枝”法 采用快速排序的思想来实现。主要思路如下:选一个数 tmp=an-1作为枢纽,把比它小的数都放在它的左边,比它大的数都放在它的右边,然后判断 tmp 的位置,如果它的位置为 k-1,那么它就是第 k 个最小的数;如果它的位置小于 k-1,那么说明第
16、 k 个小的元素一定在数组的右半部分,采用递归的方法在数组的右半部分继续查找;否则第 k 个小的元素在数组的左半部分,采用递归的方法在左半部分数组中继续查找。示例如下: public class Test public static int quikSort(int array, int low, int high, int k) int i, j; int tmp; if(lowhigh) return Integer.MIN_VALUE; i=low+1; j=high; tmp=arrayi; while(ij) while(ij if(ij) arrayi+=arrayj; while
17、(ij if(ij) arrayj-=arrayi; arrayi=tmp; if(i+1=k) return tmp; else if(i+1k) return quikSort(array, low, i-1, k); else return quikSort(array, i+1, high, k); public static int getKMin(int array, int k) if(array=null) return Integer.MIN_VALUE; if(array.lengthk) return Integer.MIN_VALUE; return quikSort(
18、array, 0, array.length-1, k); public static void main(Stringargs) int a=1, 5, 2, 6, 8, 0, 6; int kMin=getKMin(a, 4); System.out.println(kMin); 程序运行结果为: 5 表面上看起来这种方法还是在对数组进行排序,但是它比排序法的效率高,主要原因是当在数组右半部分递归查找时,完全不需要关注左半部分数组的顺序,因此省略了对左半部分数组的排序。因此,这种方法可以被看作一种“剪枝”方法,不断缩小问题的规模,直到找到第 k 个小的元素。5.如何找出数组中只出现一次的数
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 JAVA 程序员 面试 16 答案 解析 DOC
