• 【面试题】面试题合集一


    1.【阿里】“村长”带着4对父子参加“爸爸去哪儿”第三季第二站某村庄的拍摄。村里为了保护小孩不被拐走有个千年的规矩,那就是吃饭的时候小孩左右只能是其他小孩或者自己的父母。那么4对父子在圆桌上共有几种坐法。(旋转一下,每个人面的的方向变更后算是一种新的坐法)。

    A 144  B 240  C 288  D 480  E 576  F 960

    【推测-->不一定正确】


    左图中,先选择两个父亲放置在父亲团边界,剩下两个父亲和村长可以随意组合排列,而南方的两孩子位置可换,然后父亲团可以与孩子团对调,坐法有4C2*3!*2*2=216;右图,父亲随机排列除以重复排列,乘以村长可加入位置,坐法有4!/2*2=24。

    所以,共有240种坐法。

    2.【阿里】12321能被写成几种两个质数相加的形式。

    已知12321为一奇数,奇数=奇数+偶数,偶数只可能的指数为2,所以只需要判断12319是否为质数即可。

    而12319=97*127非质数,所以,12321不能写成两质数相加形式。

    3.【阿里】某团队有2/5的人会写Java程序,有3/4的人会写C++程序,这个团队里同时会写Java和C++的至少有()人 。

    假设团队有n个人,同时会写Java和C++的至少有(2/5+3/4-1)*n=0.15n,n至少为4、5的最小公倍数,即20,所以至少有3人。

    4.【腾讯】在如图6*8的矩阵中,从A到B一共有多少种走法,要求:不经过P点,每次移动只允许向上或向右。


    思路:假设有m*n矩阵,从A到B的走法表示为T(m,n),将其分成子问题得出推导公式:


    T(m,n)=T(m-1,n)+T(m-1,n-1)+...+T(m-1,1)

    仔细观察可以得知T(m,n-1)=T(m-1,n-1)+...+T(m-1,1),

    所以上式简化成T(m,n)=T(m-1,n)+T(m,n-1),并加入结束条件T(1,x)=1,T(x,1)=1,且T(m,n)=T(n,m)

    所以,可以得出一个表:

    m 1 2 3 4 5 6 7 8
    1 1 1 1 1 1 1 1 1
    2 1 2 3 4 5 6 7 8
    3 1 3 6 10 15 21 28 36
    4 1 4 10 20 35 56 84 120
    5 1 5 15 35 70 126 210 330
    6 1 6 21 56 126 252 462 792
    由于规定不能经过P点,那么将T(6,8)-f(A,P)*f(P,B)即可得出结果,即A到P点的走法乘以P到B点的走法为规定不允许的

    所以有T(6,8)-T(4,4)*T(3,5)=792-20*15=492。
    5.【腾讯】若一棵完全二叉树含有2*n-1个结点,叶子结点数为多少?

    完全二叉树性质:当完全二叉树节点数为奇数时,度为0的节点数=度为2的节点数+1

    所以叶子结点(度为0的节点)数为n。

    6.【蜻蜓FM】若一棵二叉树叶子结点个数为m,那么度为2的结点数为多少?

     假设二叉树的结点数为n,共有n-1条树枝,n0为叶子结点数,n1为度为1的结点数,n2为度为2的结点数,n=n2+n1+n0,n-1条树枝,n-1=2*n2+n1,

    两式相减得到n0=n2+1;所以n0=m,n2=m-1。

    7.【蜻蜓FM】已知无序数组A[n],其中n是一个很大的正整数,但不超过整型数表达范围,数组元素的值范围是[0,n-1],请找出A中任意一个值重复的元素,若不存在则返回-1,要求空间复杂度O(1)。

    思路:从题目中看,可以看到一个非常特别的条件,数组元素的值范围是[0,n-1],这个可以引起我们的注意。

    int search(int *d, int n){
      int k;
      while(k<n){
        if(*(d+k)==k)
          k++;
        else{
          if(*(d+k)==*(d+*(d+k)))
            return *(d+k);
          else
            swap(d+k, d+*(d+k));
        }
      }
      return -1;
    }

    8.【蜻蜓FM】假设我们提供某种脚本语言MS,他只支持int数据类型但是不支持负数,并且它只支持如下运算:

    A.清零:X=0;

    B.变量赋值:X1=X2;

    C.变量自增:X++;

    D.嵌套循环:

    Loop(X1)

        ......

        Loop(X2)

        ......

        End

    End

    请注意1.常量不能出现“0”以外的数字;2.该脚本不支持任何比较运算或if语句。

    如下程序循环执行了两次(意思是循环开始后,循环次数已经确定,不受循环体内部赋值干扰)

    X=0; X++; X++;

    Loop(X)

        X=0;

    End

    1)请用该脚本实现功能X=X-1

    思路:由于没法输入负数,所以只能通过循环自加进行减一。

    Xtemp=0; Xans=0;

    Loop(X)

        Xans=Xtemp;

        Xtemp++;

    End

    X=Xans;

    2)如果已经实现1)请实现功能X1=X1-X2,若X1<X2,执行完后X1=0;

    思路,利用1)的实现,封装为一个函数,名为func1(X),返回X-1的值,然后循环执行X2次。

    Loop(X2)

        func1(X1);

    End

    3)如果已经实现2),请实现功能X3=X1/X2,若X1<X2,执行完后X3=0。不需要考虑输入参数X2=0的情况。

    思路:以减法代替除法,得出商,比如6/3,6-3,3-3有两次,则商为2。(注意循环次数在循环开始后不能更改)

    Xs=0;

    X1++;

    Loop(X1)

        func2(X1,X2);

        Xans=0;

    //Xans+1;

        Loop(X1)

            func1(Xans);

            Xans++;

        End

        Loop(Xans)

            Xs++;

        End

    End

    X3=Xs;

    9.【百度】在由N个正整数的集合S中,找出最大元素C,满足C=A+B,其中A,B都是集合S中的元素,并给出时间复杂度。

    思路:先对无序集合进行排序,然后使用三个索引,一个是AB索引和比A+B大的元素最小索引。

    int search_c(int *d, int n){
        int ak,bk,ck;
        int maxc;
    
        if(n<=1)
            return 0;
        ak=0; bk=1; ck=0;
        qsort(d, n);
        while(ck<n){
            if(*(d+ak)+*(d+bk)>*(d+ck))
                ck++;
            else if(*(d+ak)+*(d+bk)==*(d+ck))
                maxc=*(d+ck);
            else
                (bk>ak+1)?ak++:bk++;
        }
    }

    10.【百度】使用堆栈(Stack)来模拟队列(FIFO)功能,要求数据必须储存在堆栈内部。需要实现入队,出队,判空三个功能。

    思路:使用双栈实现队列。

    定义栈结构:

    typedef struct{
        int data[MaxSize];
        int top;
    }stack_typedef;
    假设已经实现push和pop函数。

    int is_empty(stack_typedef *s){
        if(s->top==0)
            return -1;
        else
            return 0;
    }
    int push(stack_typedef *s, int newdata){
        if(top==MaxSize)
            return -1;
        else
            return (*(s->data+top++)=newdata);
    }
    int pop(stack_typedef *s){
        if(is_empty(s)==-1)
            return INT_MIN;
        else
            return *(s->data+top--);
    }
    int enqueue(stack_typedef *s, int data){
        push(s, data);
    }
    int dequeue(stack_typedef *s){
        stack_typedef *news;
        int rtn;
        news = (stack_typedef*)malloc(sizeof(stack_typedef));
        news->top=0;
        while(is_empty(s))
            push(news, pop(s));
        rtn = pop(news);
        while(is_empty(news))
            push(s, pop(news));
        return rtn;
    }








  • 相关阅读:
    百度地图代码API
    3层下拉列表
    stl+数论——1247D
    数论+乱搞——cf181B
    思维+multiset优化——cf1249E
    线性基思想+贪心——cf1249C
    tarjan求强连通+缩点——cf1248E
    排序+模拟+优先队列——cf1248E
    栈+括号序列+暴力枚举——cf1248D1
    二分+贪心——cf1251D
  • 原文地址:https://www.cnblogs.com/xhyzjiji/p/6159368.html
Copyright © 2020-2023  润新知