某互联网公司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     }

 

 

 

你可能感兴趣的:(互联网)