2014年某公司笔试题
序言:文章只是记录自己在某公司笔试中遇到的问题,答案基本都是自己写的,至于效率问题可能还待提高,思路可能还有别的,只是为了让自己有所提高而进行记录,若有错误,不当或更好的方法欢迎提出。
1、按单词翻转字符串(单词中相对的顺序保持不变),字符串存放在一个数组里面,以空格来分隔。比如有字符串"A BC DEF GH IJ KML",翻转后为"KML IJ GH DEF BE A".要求效率越高越好,且不得使用reverse、split、join之类的库函数。
思路:先把整个字符串逆序,然后找空格,继续把空格之间的字符串继续反转一次。
public static void Reverse(char[] str) { int length=str.length; int low=0,high=length-1; char temp; int flag=0;int j=0; //数组全部逆转 while(low<high) { temp=str[low]; str[low++]=str[high]; str[high--]=temp; } //对每个单词再掉转顺序 for(int i=0;i<length;i++) { if(str[i]==' ') { j=i-1; while(flag<j) { temp=str[flag]; str[flag++]=str[j]; str[j--]=temp; } flag=i+1; } } //测试,输出数组 for(int i=0;i<length;i++) { System.out.print(str[i]); } }
2、从一副扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。规则:2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意1至13的数字。
思路:1、对输入的数组先进行处理,如果有大王,小王则把数组变成四个忽略大小王,JQK分别变成题目所要求的
2、循环整个数组,得到最大值和最小值
3、若最大值-最小值>9,则把所有大于10的数变成-1*(数-11)
4、再次找出最大值和最小值,并得出最大值-最小值的差,如果大于4,则为顺子,否则不是顺子
1 public static void checkSequence(int[] data) 2 { 3 int min=getMaxMin(data)[0][0]; 4 int max=getMaxMin(data)[0][1]; 5 6 if(max-min>10) 7 { 8 for(int i=0;i<data.length;i++) 9 { 10 if(data[i]>10) 11 data[i]=(-1)*(data[i]-11); 12 } 13 min=getMaxMin(data)[0][0]; 14 max=getMaxMin(data)[0][1]; 15 } 16 if(max-min<5) 17 System.out.println("顺子"); 18 else 19 System.out.println("非顺子"); 20 } 21 public static int[][] getMaxMin(int[] data) 22 { 23 int length=data.length; 24 int max=0,min=0; 25 int a[][]=new int[1][2]; 26 for(int i=0;i<length;i++) 27 { 28 if(data[i]<min) 29 { 30 min=data[i]; 31 } 32 if(data[i]>max) 33 { 34 max=data[i]; 35 } 36 } 37 a[0][0]=min; 38 a[0][1]=max; 39 return a; 40 }
3、给出定义:在整型数组中,数字减去它右边的数字得到一个数对之差,求所有数对之差的最大值。需要考虑时间、空间复杂度,效率越高越好,并给出分析
例如在数组{2,4,1,16,7,5,11,9}中,数对之差的最大值是11,是16减去5的结果。
思路:从尾到头扫描整个数组,得出每个数右边的最小值构成一个数列;从头到尾扫描一遍数组,把数组中的数跟其右边的数相减并得到最大的值即为答案。
空间复杂度有点高,时间复杂度就是O(N);
1 public static void getMaxPair(int[] data) 2 { 3 int length=data.length; 4 int[] minarray=new int[length-1]; 5 int min=data[length-1]; 6 int max=0; 7 for(int i=length-2;i>=0;i--) 8 { 9 if(data[i+1]<min) 10 { 11 min=data[i+1]; 12 } 13 minarray[i]=min; 14 } 15 for(int i=0;i<length-1;i++) 16 { 17 if(data[i]-minarray[i]>max) 18 { 19 max=data[i]-minarray[i]; 20 } 21 } 22 System.out.println(max); 23 }