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;
}