網易有道面經(2013校園招聘杭州站)

上機考試:

網易有道的篩選模式是先上機考試,然後根據上機考試選擇大概1/3參加面試。上機的平臺和ACM有點類似,提交代碼然後有手動閱卷。

上機考試時隔比較久遠,不過還能想起兩個題目:

1. 給定一個點分IP地址表示,寫個程序把它轉換成相應的32位的無符號整數並輸出,如果輸入不是合法數據,就返回0.

這個題目如何利用好標準輸入輸出,其實可以很容易判斷出不合法的輸入用例,不過當時沒有想好,導致這個題目沒有AC。

後來回去寫的代碼如下:

#include <stdio.h>
#include <string.h>
bool checkpoint(char *str){

	int npoint = 0;
	while(*str){
		(*str) == '.' ? npoint++ : npoint;
		if(*(str) != '.' && !((*str) <= '9' && (*str) >= '0')) return false;
		str++;
	}
	return npoint == 3;
}

bool checkinrange(int addr[4]){
	for(int i = 0; i < 4; i++){
		if(addr[i] > 255){
			return false;
		}
	}
	return true;
}
bool convertIP(char s[], int addr[4]){
	char tmp[128];
	if(checkpoint(s)){
		sscanf(s, "%d.%d.%d.%d",addr, addr + 1, addr + 2, addr + 3);
		sprintf_s(tmp, sizeof(tmp), "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
		if(strcmp(s, tmp) == 0 && checkinrange(addr)){
			return true;
		}

		//sprintf_s()
	}
	return false;
}
int main()
{
	char s[128] = {0};
	int addr[4];
	
	while(scanf("%s", s) != EOF){
		memset(addr, -1, sizeof(addr));
		if(convertIP(s, addr))
		{
			unsigned int result = 0;
			result = addr[0] * (0x1 << 24);
			result += addr[1] * (0x1 << 16);
			result += addr[2] * (0x1 << 8);
			result += addr[3];
			printf("%u\n", result);
		}
		else{
			printf("-1\n");
		}

	}

	return 0;
}
2. 給出大小爲N的數組,用最快的辦法找出前M個大的數字

這個題目可以用一個大小是M的最小堆來實現,初始建堆用數組前M個建好後,如果後面的元素a[i] 大於堆頂元素,那麼就刪除堆頂,插入新的元素。

#include <queue>
#include <vector>
using namespace std;

int main(){

	priority_queue<int,std::vector<int>, std::greater<int>> q;

	int n,m;
	int num;
	scanf("%d%d", &n, &m);

	int i;
	for(i = 0; i < m; i++){
		scanf("%d", &num);
		q.push(num);
	}

	for( ; i < n; i++){
		scanf("%d", &num);

		if(num > q.top()){
			q.pop();
			q.push(num);
		}
	}
}

一面:

面試官是一個看起來比較技術的MM,MM上來什麼也沒有問,直接來算法。

題目1. 一個人在網上做項目,加入每天都有很多項目可以選,每個項目都有一個開始時間和截止時間,假設每個項目的錢是一樣的,那麼在n天內,如何安排自己的接活才能保證賺錢最多。

問題簡化後就是貪心的活動安排問題, 傳送門:http://blog.csdn.net/a9529lty/article/details/4042019

然後證明(想半天,沒有想出來)


問題2. 假如這個時候,每個活的錢數是不同的,可以獲得最大的錢數是多少?

(我給的答案是枚舉任務,然後做dp)

寫代碼....

#define MAX_TAST 100
struct Task{
	int s, e;
	int val;
};

bool TaskInRange(const Task &t, int s, int e){
	return t.s >= s && t.e <= e;
}

int dp[MAX_TAST][MAX_TAST];
int nTask;
Task aTask[MAX_TAST];
int GetMaxValue(int s, int e){

	if(dp[s][e] != -1){
		return dp[s][e];
	}
	if( s == e){
		return dp[s][e] = 0;
	}
	int maxvalue = 0;
	for(int i = 0; i < nTask; i++){
		if(TaskInRange(aTask[i], s, e))
		{
			int value = GetMaxValue(s, aTask[i].s) + 
				        GetMaxValue(aTask[i].e, e) +
						aTask[i].val;
			if(value > maxvalue){
				maxvalue = value;
			}
		}
	}
	return dp[s][e] = maxvalue;
}

然後她問我如何優化,我說可以先把任務排序,然後搜索到合適的任務豈止點,將枚舉從O(n)降低到O(logn).


二面:

二面先聊自我介紹,簡要介紹之前做的項目

問題1. 寫代碼:判斷一個數字序列是BST後序遍歷的結果,下面是我現場寫的代碼,沒有測試過

bool IsPostOrderOfBST(int array[], int low, int high)
{
	if(low >= high){
		return true;
	}
	int split = -1, i;

	for( i = low; i < high; i++){
		if(split != -1 && array[i] < array[high]){
			return false;
		}
		if(split == -1 && array[i] > array[high]){
			split = i;
		}
	}
	if(split == -1){
		return IsPostOrderOfBST(array, low, high-1);
	}
	return IsPostOrderOfBST(array, low, split-1) && IsPostOrderOfBST(array, split, high-1);
}

問題2. 寫一個單件模式,然後順便被我引導到扯扯 線程安全 異常安全等話題,我不斷完善最初代碼使得滿足線程安全和異常安全。

下面的代碼大概是最初版本: 

#include <stdio.h>


class Singleton{


private:

	Singleton(){}
	Singleton(const Singleton &);
	Singleton& operator=(const Singleton&);

public:

	static Singleton *Instantialize();
	static Singleton *pInstance;
};

Singleton* Singleton::pInstance = 0;
Singleton* Singleton::Instantialize(){

	if(pInstance == NULL){
		pInstance = new Singleton();
	}
	return pInstance;
}


然後大概擴展到如下形式:

class Lock{
private:       
	CRITICAL_SECTION &m_cs;
public:
	Lock(CRITICAL_SECTION cs):m_cs(cs)
	{
		m_cs.lock();
	}
	~Lock()
	{
		m_cs.unlock();
	}
};

class Singleton{
private:
	Singleton();
	Singleton(const Singleton );
	Singleton operator = (const Singleton &);

public:
	static Singleton *Instantialize();
	static Singleton *pInstance;
	static CRITICAL_SECTION cs;
};
Singleton* Singleton::pInstance = 0;
Singleton* Singleton::Instantialize()
{       if(pInstance == NULL){//double check
	Lock lock(cs);//用lock實現線程安全,用資源管理類,實現異常安全
	if(pInstance == NULL)
	{
		pInstance = new Singleton();
	}}
	return pInstance;
}


問題3 對C++ virtual的理解 . 我從實現角度給他說了  虛函數和虛繼承

問題4 如果有一個websever,例如12306,用戶量特別大,網站面臨效能問題,如何解決。

          我先胡扯了線程池,然後又扯到多個機器搞這個問題等等

最後問一下我對什麼感興趣,他給我介紹了有道雲筆記。

總結: 

和很多人分享了一些面試題目,感覺我面試的題目難度是比較水的,感覺其他同學面的都很難。有道說十一以後還會安排三面,是技術總監面試,估計也是終面了吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章