2016年美團校園招聘數據開發工程師筆試編程題

2015年10月11日,今天做美團數據開發工程師筆試題。其中最後兩道編程題如下。
第一題:給X軸上n個點,這n個點可組成n*(n-1)/2條線段,求第k長的線段的長度。
參數
points: 點座標數組,整形數組
n:點數量,整型
k: 整型
返回值
第k長線段:整形
實例參數:
points:[0,1,3,5]
n:4
k:5
示例返回:
2
解法:這個題目開始還怎麼理解,返回k長線段,我的理解假設線段長度數組爲:{1,3,5,2,2,2},則第1長的線段爲5,第2長的線段爲3,第3長的線段爲2,第4長爲 2,第五長也爲2,第6長的我1。那麼第k長的線段需要把n*(n-1)/2條線段從大小到小排序。取第線段長度數組第k-1個數即可。

#include<iostream>
using namespace std;
int solve(int *points, int n, int k) {
    int sumofline;
    int *lengthofline; //用來存取所有線段長度
    int i,j,x,l,m=0;
    sumofline = n*(n-1)/2; //總的線段數
    lengthofline = (int *)malloc(sizeof(int)*sumofline);
    //兩重循環求取線段長度。
    for (i=0;i<n;++i){
        for(j=i+1;j<n;++j){
            lengthofline[m]=points[j]-points[i]; 
            m++;
        }
    }
    //對線段長度排序,選擇排序法排序從大到小排序,當對第k-1條線段排序時,即找到線段第k長線段。
    for(i=0;i<=m-1;i++){
        l=i;
    x=lengthofline[i];
        for(j=i+1;j<=m-1;j++){
            if(lengthofline[j]>x)
            {
                l=j;
            }
            x=lengthofline[l];  
        }
        if(l!=i){
        lengthofline[l]=lengthofline[i];
        lengthofline[i]=x;
        }
    }
      if(i==k-1)
       return lengthofline[k-1];
}
int main(){
    int p[]={0,1,5,9};
    cout<<solve(p,4,5)<<" ";
    return 0;
}
第二道編程題:
給定一個整型數組,數組中存放的數字單調不減,及m<n,
a[m]<=a[n].
編寫一個程序,輸入一個數字,返回這個數字在數組中出現的中間位置。
參數
arr:單調不減整型數組
size:數組長度,整型
num:給定數字,整型
返回值
中間位置:整型
示例參數
arr:【1,2,2,2,3,7】
size :6
num: 2
(2 出現下標的位置爲1,2,3,的位置)
示例返回值
2
提示
如果某個出現偶數次,比如n次,n爲偶數,返回第n/2個下標。
如果輸入的數字不存才,程序應該返回-1.

解法:先用二分查找在數組找到這個數字出現位置,在分別設置兩個指針,從中間往兩邊遍歷數組,同時統計相同的數字出現次數。當出現次數大於1次,返回下標兩個指針平均位置。當出現次數爲1時,直接返回mid。當不出現數字時,返回-1.
#include<iostream>
using namespace std;
int locationOfNum(int *arr,int size,int num){
    int left = 0;
    int right = size-1;
    int mid;
    int i,j;
    int count = 0;
    while(left <= right){
         mid = left + (right - left) / 2;
         if (arr[mid] == num)
             break;
         else if (arr[mid] < num)
             left = mid + 1;
         else
             right = mid -1;
    }
    if (left <= right)
    {  
        i = mid;
        j = mid + 1;
        int flag =1;
        while (flag && (i >= left)){
            flag = 0;
            if (arr[i] == num){
                ++count;
                --i;
                flag = 1;
            }
        }
        flag = 1;
        while (flag && (j <= right)){
            flag = 0;
            if (arr[j] == num){
                ++count;
                ++j;
                flag =1;
            }
        }
        if( count >1)
            return  (i + j ) / 2;
        if(count == 1)
            return mid;
    }
    return -1;
}

int main(){
    int p[]={1,2,2,2,3,7};
    cout<<locationOfNum(p,6,2)<<" ";
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章