美团点评研发笔试卷-2013年

1、有ABCD四个人要在夜里过一座桥,他们通过这座桥分别需要耗时1、2、5、10分钟,现在只有一支手电,过桥时必须带有手电,并且同时最多只能两个人一起过桥。请问如何安排能够让四个人尽快都过桥。

2、 25匹马赛跑,每次只能跑5匹马,最快能赛几次找出跑得最快的3匹马?赛跑不能计时,并假设每匹马的速度是恒定不变的。请给出答案并描述比赛过程。 

3、在有团购之前,大家都是现场买门票,公园的门票是5元,某天售票处开门时没有准备零钱。假设一天来购票的依次有2N个人,其中有N个人有5元零钱,其他N个人只有10元面值的钱;假设每人只买一张票。请问任何人都不必为找零而等待的概率是多少? 

4、有一个函数“int f(int n)”,请编写一段程序调试函数f(n)是否总是返回0,并添加必要的注视和说明。

5、 用你熟悉的语言编写程序用两个栈(Stack)模拟队列(Queue)的先进先出操作,仅实现add、remove方法即可。
1)请先描述思路; 2)编写完整代码实现,编程语言不限。

6、编写函数,获取两段字符串的最长公共子串的长度,例如:
        S1= GCCCTAGCCAGDE
        S2= GCGCCAGTGDE
这两个序列的最长公共子串是GCCAG,也就是说返回值。

1)请先描述思路;
2)编写完整代码实现,编程语言不限。
7、(iOS开发选做)实现多线程都有哪几种方法?

8、(Android开发选做)关于Activity的生命周期,下拉statusbar时,桌面Activity会触发哪几个生命周期?系统关机时,弹出关机Dialog之后,此时,桌面Activity会触发哪几个生命周期?

9、(系统运维选做)有主机A、B、C通过eth0和同一个交换机相连,A的IP地址为192.168.1.2,子网掩码255.255.255.0,B的IP地址为192.168.2.2,子网掩码255.255.255.0,C的IP地址为192.168.4.2,子网掩码255.255.255.0。现希望A和B能够通信,A和C、B和C不能通信。
1)假设能更改A和B的子网掩码,要如何设置A和B的子网掩码?
2)如果不能更改子网掩码,需要在A和B做什么设置?
3)A和B通信时,C是否能够通过sniffer截获A和B通信的报文,如果只能截获一部分报文,是哪一类报文?
4)C可以仅通过sniffer得知A和B的IP地址和MAC地址吗?如果能,如何获得?

 

参考答案

1、AB,A,CD,B,AB
    1和2 先过。1返回,5和10先过,2返回,1和2一起过。一共时间=2+1+10+2+2=17分钟
2、第一--五局:分成5个组,可以得出5个组的第一名

第六局:5个第一名一起跑,这样可以得出最快的那一匹。

第七局:可能成为2,3名的再赛一次,包括最快组的2,3名,次快组的1,2名,第三快组的第1名。

所以一共是7次
3、为了将问题简单化,将持有5元的人看成1,持有10元的人看成0,这样,只要满足:在任何0位置之前,1的数目多于0的数目,就能满足要求,则该题求解的为满足要求的排列占全部排列的比例。
    1)求2n个1和0的全排列数目:C(2n,n),即从2n个位置中选取n放置0(或者1)。
    2)求取不满足要求的组合数(合法的组合数不好求):
    不满足要求的组合数的特点:总能找到一个位置K,使得0的数目比1的数目多1。那么很明显,k后面的0的数目比1的数目要少1.(为什么要找位置k?因为,我要让前面K个位置0、1排列不管怎么排列都不合法)
此后,我们关注k位置后面的排列:因为k后面的排列中,明显0比1少,那么我们可以将0和1互换(为什么要互换?首先,0、1互换后,两种排列方式的总数目是不变的,其次,互换后的排列中0比1多1个,那么不管怎么排列,都不合法),这样互换后2n个数的排列不管怎么排列都不合法(值得注意的是,互换后的组合排列数目,和互换前的是相同的,因为前面的排列不变且后面排列组合方式的数目一样。
    现在来计算互换后排列的数目:互换后排列的数目中0为n+1个,1为n-1个,那么组合数就相当于从2n个位置选取n+1个位置放0,即为C(2n,n+1)
    所求结果为 ( C(2n,n)-C(2n,n+1) ) /  C(2n,n)
4、如下:
int n = INT_MIN; 
do 
{ 
    if(0 != f(n)) 
    { 
        //error 
        break;
     }
} 
while(n++ != INT_MIN); 

if(n != INT_MIN) error;// 
5、思路:把栈比喻成水杯,将A水杯中的水倒入B水杯中(不考虑水的流动性),之前A水杯中最下面的水就会在B水杯中的最上面,就实现了队列的先进先出原则。
代码如下: 
import java.util.Stack;
public class StackToQueue {
    static Stack<Integer> stack1 = new Stack<Integer>();
    static Stack<Integer> stack2 = new Stack<Integer>();
     
    public void add(int node) {
        stack1.push(node);
    }
     
    public int remove() {
        if(stack2.isEmpty()){//pop时如果stack2为空则将stack1内元素倒置入stack2,取栈顶元素;
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}
6、思路:
使用动态规划,参考算法导论中所写。

子串x(ABCBDAB),y(BDCABA)

生成的c数组为(数组c,b皆省略了第一行和第一列ps:全为零)
0 0 0 1 1 1
1 1 1 1 2 2
1 1 2 2 2 2
1 1 2 2 3 3
1 2 2 2 3 3
1 2 2 3 3 4
1 2 2 3 4 4
用来记录路径的数组b(0代表斜上,1代表上,-1代表左边,,即c[i][j]是依赖c[i-1][j-1]或c[i][j-1]或c[i-1][j])
1 1 1 0 -1 0
0 -1 -1 1 0 -1
1 1 0 -1 1 1
0 1 1 1 0 -1
1 0 1 1 1 1
1 1 1 0 1 0
0 1 1 1 0 1
代码如下:
public int LCS_LENGTH(String x,String y){ int m=x.length(),n=y.length();
    nt b[][]=new int[m+1][n+1];
    int c[][]=new int[m+1][n+1];
    Vector<Character> res= new
    Vector<Character>();
    for(int i=1;i<=m;i++){
    for(int j=1;j<=n;j++)
        if(x.charAt(i-1)==y.charAt(j-1)){
            c[i][j]=c[i-1][j-1]+1;
            b[i][j]=0; }
        else if(c[i-1][j]>=c[i][j-1]){
            c[i][j]=c[i-1][j];
            b[i][j]=1;
        }
        else {
            c[i][j]=c[i][j-1];
            b[i][j]=-1;
        }
    }
    int i=m,j=n;
    while(i!=0&&j!=0){//根据b来寻找最大子序列的路径
        if(b[i][j]==0){
            res.add(0,x.charAt(i-1));
            i--;
            j--;
        }else if(b[i][j]==-1){
            j--;
        }else
            i--;
        }
    return res;
}
7、poll、epoll、线程池
8、下拉statusbar时,会触发桌面Activity的onPause, onStop();系统关机弹出关机Dialog之后,会触发Activity的onPause()。
9、1) 通过修改A B掩码使得它们能互相通信的话,只需要AB 同在一个子网。因此A 和B 的掩码为255.255.252.0 ,C不变
2)A的IP 地址修改为与B 同一个网段,如192.168.2.3
个人资料
Bingo
等级:9
文章:694篇
访问:38.9w
排名: 1
上一篇: 美团点评研发工程师笔试卷-2012年
下一篇:美团点评研发工程师笔试题(一)-2016
猜你感兴趣的圈子:
美团笔试面试圈
标签: 排列、互换、2n、stack2、数目、面试题
隐藏