想要面试过的去,必须每日一刷题! 关于Android面试这里我就不多讲了,直接上题。面试题:1。寻找数组中第二小的元素直接排序(冒泡n2、快排nlgn)根据索引找到对应值遍历一次,定义两个变量:一个变量用来存储数组的最大数,初始值为数组首元素,另一个变量用来存储第二大的数。 编码:1。publicstaticvoidfindSecond(inta〔〕){2。if(a。length3){3。System。out。println(数组太小);4。}5。intmax0,min0;6。for(inti1;ia〔i1〕i2){确定两个最大初始值8。maxa〔i〕;9。mina〔i1〕;10。continue;11。}12。if(a〔i〕maxi1){大于最大值13。minmax;14。maxa〔i〕;15。}16。if(a〔i〕maxa〔i〕mini1){介于两者之间17。mina〔i〕;18。}19。}20。System。out。println(max:max);21。System。out。println(min:min);22。}2。找到数组中第一个不重复出现的整数用数组存储每个数字出现的次数,但题目只需要找到第一个不重复出现的数,故浪费空间,O(N2)双循环,找到第一个不重复,即返回,O(N2) 编码1:1。2。找出数组中第一个不重复的数字,如果没有就返回null3。4。publicclassFirstDupNum{5。Test6。publicvoidstart(){7。int〔〕arr{1,2,3,9,7,66,5,5,4,66,3,7,2,9,0,0,1,4};8。System。out。println(handler(arr));9。}10。publicIntegerhandler(int〔〕arr){11。Integerpositionnull;12。for(inti0;iarr。length;i){13。for(intj0;jpreh1classpgcharrowrightdatatrack153。合并两个有序数组h1pdatatrack16strongspanstylecolor:333333;ttdarkmodecolor:A3A3A3;给定两个有序整数数组nums1和nums2,将nums2合并到nums1中,使得num1成为一个有序数组。spanstrongpdatatrack17strongspanstylecolor:333333;ttdarkmodecolor:A3A3A3;示例:spanstrongullidatatrack18spanstylecolor:333333;ttdarkmodecolor:A3A3A3;nums1〔1,2,3,0,0,0〕,m3spanlilidatatrack19spanstylecolor:333333;ttdarkmodecolor:A3A3A3;nums2〔2,5,6〕,n3spanlilidatatrack20spanstylecolor:333333;ttdarkmodecolor:A3A3A3;输出:〔1,2,2,3,5,6〕spanliulpdatatrack21strongspanstylecolor:333333;ttdarkmodecolor:A3A3A3;方法一:合并后,七大排序spanstrongspanstylecolor:333333;ttdarkmodecolor:A3A3A3;这个方法有点生硬,我将nums2数组拷贝到nums1后面,然后得到一个无顺序的数组,这个时候我们学过的七大排序就派上用场了,这里我采用插入排序为例子:spanprecode1。classSolution{2。publicvoidmerge(int〔〕nums1,intm,int〔〕nums2,intn){3。if(n0){4。return;5。}6。for(inti0;inums2。length;i){7。nums1〔mi〕nums2〔i〕;8。}9。insertSort(nums1,mn);10。}11。publicvoidinsertSort(int〔〕array,intlength){12。这是插入排序13。for(intbound1;boundlength;bound){14。inttmparray〔bound〕;15。intcurbound1;16。for(;cur0;cur){17。if(array〔cur〕tmp){18。array〔cur1〕array〔cur〕;19。}else{20。break;21。}22。}23。array〔cur1〕tmp;24。}25。}26。} 时间复杂度:O(N2)空间复杂度:O(1) 方法二:合并后排序arraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)Copiesanarrayfromthespecifiedsourcearray,beginningatthespecifiedposition,tothespecifiedpositionofthedestinationarray。意思是,将src数组拷贝到dest目标数组,从0(srcPos)开始拷贝,拷贝到目标数组从m(destPos)开始拷贝,拷n这么长1。publicvoidmerge(int〔〕nums1,intm,int〔〕nums2,intn){2。System。arraycopy(nums2,0,nums1,m,n);3。Arrays。sort(nums1);排序4。} 方法三:双指针法这个方法有点类似合并两个有序链表也是用两个指针,一个指向nums1(Copy),一个指向nums2,比较大小然后放入nums1中具体实现代码如下:1。publicvoidmerge(int〔〕nums1,intm,int〔〕nums2,intn){2。int〔〕nums1Copynewint〔m〕;3。将nums1新拷贝一份4。System。arraycopy(nums1,0,nums1Copy,0,m);两个指针,一个指向nums1Copy,一个指向nums2intp10;intp20;intp0;指向nums1最终要输出的while((p1m)(p2n)){nums1〔p〕(nums1Copy〔p1〕nums2〔p2〕)?nums1Copy〔p1〕:nums2〔p2〕;}if(p1m)System。arraycopy(nums1Copy,p1,nums1,p,mp1);if(p2n)System。arraycopy(nums2,p2,nums1,p,np2);}4。重新排列数组中的正值和负值 给定一个包含正数和负数的整数数组,重新排列它,使得所有的负数排在前面,所有的正数排在后面。正数间和负数间的相对顺序保持不变。期望时间复杂度是O(n),空间复杂度是O(1)。 例如:给定〔1,2,2,3,5,4〕,重新排列后变成〔1,2,4,2,3,5〕 分析:最简单的算法是O(n2),遇到每个负数都把它移动到数组前面已经排列好的负数部分后面。O(n)的算法暂时没想出来,似乎比较难,下面给出一个O(nlogn)的算法。基本思想类似于MergeSort。空间复杂度由于用到递归,是O(logn)。不过可以很容易改写为bottomup的迭代版本。 编码:1。voidMain()2。{3。int〔〕numsnewint〔〕{1,2,2,3,5,4};4。5。Reorder(nums,0,nums。Length1);6。}7。8。Defineothermethodsandclasseshere9。publicvoidReorder(int〔〕nums,intstart,intend)10。{11。if(startend){12。return;13。}14。15。intmiddlestart(endstart)2;16。Reorder(nums,start,middle);17。Reorder(nums,middle1,end);18。Merge(nums,start,middle,end);19。}20。21。privatevoidMerge(int〔〕nums,intstart,intend)22。{23。intistart;24。while(nums〔i〕0iend)i;25。intjend;26。while(nums〔j〕0jstart)j;27。28。Shiftthenegativeparttothefront29。if(ij){30。intkj;31。while(kinums〔k〕0)k;32。33。Reverse(nums,i,k);34。Reverse(nums,k1,j);35。Reverse(nums,i,j);36。}37。}38。39。privatevoidSwap(int〔〕nums,inti,intj)40。{41。inttnums〔i〕;42。nums〔i〕nums〔j〕;43。nums〔j〕t;44。}45。46。privatevoidReverse(int〔〕nums,inti,intj)47。{48。while(ij){49。Swap(nums,i,j);50。i;51。j;52。}53。} 下面是自底向上的迭代版本。空间复杂度是O(1)。1。publicvoidReorder(int〔〕nums)2。{3。intnnums。Length;4。5。for(intsize1;sizen;sizesize)6。{7。for(intlow0;lownsize;lowsizesize)8。{9。Merge(nums,low,Math。Min(lowsizesize1,n1));10。}11。}12。}总结: 上面所述就是常常被问到的数据结构的数组面试题;后续还有算法、数据结构、Java面试、Android面试题。 自己也是从事Android开发5年有余了;最近整理了一些Android面经题纲,里面讲解的非常详细。想要进阶自己、拿高薪的同学请私信我回复核心笔记或面试领取!