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