【面試題】面試題合集一

1.【阿里】「村長」帶着4對父子參加「爸爸去哪兒」第三季第二站某村莊的拍攝。村裏爲了保護小孩不被拐走有個千年的規矩,那就是吃飯的時候小孩左右只能是其餘小孩或者本身的父母。那麼4對父子在圓桌上共有幾種坐法。(旋轉一下,每一個人面的的方向變動後算是一種新的坐法)。數組

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

【推測-->不必定正確】


左圖中,先選擇兩個父親放置在父親團邊界,剩下兩個父親和村長能夠隨意組合排列,而南方的兩孩子位置可換,而後父親團能夠與孩子團對調,坐法有4C2*3!*2*2=216;右圖,父親隨機排列除以重複排列,乘以村長可加入位置,坐法有4!/2*2=24。oop

因此,共有240種坐法。spa

2.【阿里】12321能被寫成幾種兩個質數相加的形式。code

已知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至少爲四、5的最小公倍數,即20,因此至少有3人。ci

4.【騰訊】在如圖6*8的矩陣中,從A到B一共有多少種走法,要求:不通過P點,每次移動只容許向上或向右。it


思路:假設有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\n 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;
}
相關文章
相關標籤/搜索