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个数即可。
第一题:给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; }
相关文章推荐
- 【Python】Learn Python the hard way, ex26 修改代码错误
- PHP实现二分查找(递归与非递归)
- 在php 中使用mail函数
- 链串的实现C++封装
- java 子类构造函数与父类构造函数
- 身份认证和消息合法性验证方案分享
- SpringMVC与Struts2区别与比较总结
- ubuntu下手动安装python源码
- JAVA合法标识符
- java中form以post、get方式提交数据中文乱码问题总结
- Asp.net笔记(原创)
- Java File类总结和FileUtils类
- Python源码剖析笔记7-类机制
- spring事务的隔离级别配置
- java Date GregorianCalendar
- phpStudy如何修改端口及WWW目录
- 编写函数,接受一对指向vector<int>的迭代器和一个int值。在两个迭代器指定的范围内查找给定的值,返回一个布尔值来指出是否找到。
- Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
- SpringMVC工作原理
- java 复制文件