大眾點評網的校招題還真有特點,分四部分,第一部分是行測的數字規律類題目,第二部分是行測的圖形規律題,第三部分是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