---恢复内容开始---
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个数即可。
1 #include<iostream> 2 using namespace std; 3 int solve(int *points, int n, int k) { 4 int sumofline; 5 int *lengthofline; //用来存取所有线段长度 6 int i,j,x,l,m=0; 7 sumofline = n*(n-1)/2; //总的线段数 8 lengthofline = (int *)malloc(sizeof(int)*sumofline); 9 //两重循环求取线段长度。 10 for (i=0;i<n;++i){ 11 for(j=i+1;j<n;++j){ 12 lengthofline[m]=points[j]-points[i]; 13 m++; 14 } 15 } 16 //对线段长度排序,选择排序法排序从大到小排序,当对第k-1条线段排序时,即找到线段第k长线段。 17 for(i=0;i<=m-1;i++){ 18 l=i; 19 x=lengthofline[i]; 20 for(j=i+1;j<=m-1;j++){ 21 if(lengthofline[j]>x) 22 { 23 l=j; 24 } 25 x=lengthofline[l]; 26 } 27 if(l!=i){ 28 lengthofline[l]=lengthofline[i]; 29 lengthofline[i]=x; 30 } 31 } 32 if(i==k-1) 33 return lengthofline[k-1]; 34 } 35 int main(){ 36 int p[]={0,1,5,9}; 37 cout<<solve(p,4,5)<<" "; 38 return 0; 39 }
第二道编程题:
给定一个整型数组,数组中存放的数字单调不减,及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.
1 #include<iostream> 2 using namespace std; 3 int locationOfNum(int *arr,int size,int num){ 4 int left = 0; 5 int right = size-1; 6 int mid; 7 int i,j; 8 int count = 0; 9 while(left <= right){ 10 mid = left + (right - left) / 2; 11 if (arr[mid] == num) 12 break; 13 else if (arr[mid] < num) 14 left = mid + 1; 15 else 16 right = mid -1; 17 } 18 if (left <= right) 19 { 20 i = mid; 21 j = mid + 1; 22 int flag =1; 23 while (flag && (i >= left)){ 24 flag = 0; 25 if (arr[i] == num){ 26 ++count; 27 --i; 28 flag = 1; 29 } 30 } 31 flag = 1; 32 while (flag && (j <= right)){ 33 flag = 0; 34 if (arr[j] == num){ 35 ++count; 36 ++j; 37 flag =1; 38 } 39 } 40 if( count >1) 41 return (i + j ) / 2; 42 if(count == 1) 43 return mid; 44 } 45 return -1; 46 } 47 48 int main(){ 49 int p[]={1,2,2,2,3,7}; 50 cout<<locationOfNum(p,6,2)<<" "; 51 return 0; 52 }
欢迎广大网友提出自己解法,现在忙于笔试和面试,有时间在来更新。
---恢复内容结束---
浙公网安备 33010602011771号