您的位置:首页 > 编程语言

2016年美团校园招聘数据开发工程师笔试编程题

2015-10-11 20:08 507 查看
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
.
编写一个程序,输入一个数字,返回这个数字在数组中出现的中间位置。
参数
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: