某互联网公司2014年笔试题

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     }

 

 

 

posted on 2013-10-26 18:24  晨风暮鼓  阅读(304)  评论(0编辑  收藏  举报