您的位置:首页 > 其它

大众点评网2016校招试题选录

2015-09-17 22:30 190 查看
大众点评网的校招题还真有特点,分四部分,第一部分是行测的数字规律类题目,第二部分是行测的图形规律题,第三部分是C++、Java的基础选择题,第四部分是四个编程题。

题目都有时间限制,第一二部分皆是普通的行测题,第三四部分回归到编程题。总的感觉是行测题开始比较简单,后面比较难,程序类题目考了java和C++,我是不会java的,所以就半猜半写了。下面把我记下来的一些题写下来,以飨读者。

1.(C++) 在32位系统下,有如下的结构定义

struct

{

short x;

int y;

}A;

struct

{

short x;

long y;

char z;

}B;

则cout<<sizeof(A)<<sizeof(B)的执行结果是()

A. 5 12 B. 6 8 C. 8 12 D. 3 7

解析:

上述问题主要考了结构体的字节对齐问题,A:short 2字节,int 4字节,对齐后,所以sizeof(A)=8,B: short 2字节,long 4字节,char 1字节,对齐后sizeof(B)=12字节。因此选择C

2.有N个未排序的数组成的数组,和一个数sum,我们希望找到两个数,他们的和最接近sum.问时间复杂度为()

A.n B. nlog(n) C.n^2 D.n^2long(n)

解析:

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
struct node
{
int x;//代表元素
int num;//代笔元素的个数
};
void FindTwoNums(int a[], int n, int sum)//找出最接近sum的两个数
{
int left, right, error;
int low=a[0], high=a[0];
for (int i = 1; i < n; i++)
{
if (low>a[i])
{
low = a[i];
}
if (high<a[i])
{
high = a[i];
}
}
vector<node> data(high - low + 1);
for (auto& it:data)
{
it.num = 0;
it.x = 0;
}
for (int k = 0; k < n;k++)
{
data[a[k] - low].num++;
data[a[k] - low].x = a[k];
}
int	i = 0;
int j = high - low;
left = data[i].x;
right = data[j].x;
error = abs(left + right - sum);
while (i<j)
{
while (i<j&&data[j].num==0)
{
j--;
}
while (i<j&& data[i].num==0)
{
i++;
}
if (data[i].x+data[j].x==sum)
{
cout << "两个数已找到,他们分别是" << " " << data[i].x << " "<<data[j].x << endl;
return;
}
else
{
if (abs(data[i].x+data[j].x-sum)<error)
{
left = data[i].x;
right = data[j].x;
error = abs(left + right - sum);
}
if (data[i].x + data[j].x>sum)
{
data[j].num--;
}
else
{
data[i].num--;
}
}
}
cout << "两个数已找到,他们分别是" << " " << left << " " << right << endl;

}

int main()
{
int a[] = { 2, 5, 6, 6,8, 10 };
FindTwoNums(a, 5, 9);
return 0;
}


选A
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: