大众点评网的校招题还真有特点,分四部分,第一部分是行测的数字规律类题目,第二部分是行测的图形规律题,第三部分是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