1. 程式人生 > >暢遊筆試題錯題小記

暢遊筆試題錯題小記

  今天收到暢遊的線上筆試,就打算來試試了,就當去校招前練練手,因為暢遊校招只招19屆…ORZ
  暢遊的題很奇怪,分為兩大類,第一類與遊戲相關的基礎題和閱讀理解(中間涉及一些小計算),第二類就是程式設計相關的單選題以及程式設計大題。
  不討論基礎題,只是論程式設計題的話,難度簡單,然鵝我還是沙比了,犯了很多錯誤,程式設計答題有兩道大題,第一題是計算最短路徑距離,第二題則是一個數值計算題。
程式設計大題1:
  這題也是我犯傻的地方,在看到第一題的簡介的時候(什麼玩家鴨NPC鴨),因為題沒看全,我第一時間想到的是ASTAR演算法,因為考慮到可能存在障礙物所以才打算採用,於是乎我就開始寫了一大段程式碼,以及回想ASTAR演算法距離計算以及更新路徑資訊,然後每個函式除錯一下,到最後看到測試用例以及說明就傻眼了,沒有障礙物設定,就給了玩家座標和NPC座標,讓你算和哪個NPC最近

,再加上牛客和VS使用的編譯器以及函式庫有些不一樣,導致有些檔案顯示未宣告,浪費了很多時間,最後刪了一大段程式碼,實際就解析字串,計算距離就完事了-_-…

int setNpcPos(char *pos,vector<int> &m_vec) {
	int x, y, count = 0;
	char *tmp = pos, *target;
	char buff[10];
	bool is = true;
	while (tmp) {
		target=strstr(tmp, ",");
		if (target!=NULL) {
			if (*target == '\0') {
				break;
			}
			*target = '\0';
			sprintf(buff, "%s", tmp);
			int t_tmp = atoi(buff);
			if (is) {
				x = t_tmp;
				is = false;
				m_vec.push_back(x);
			}
			else {
				y = t_tmp;
				is = true;
				count++;
				m_vec.push_back(y);
			}
			*target = ',';
			tmp = target+1;
		}
		else {
			y = atoi(tmp);
			count++;
			m_vec.push_back(y);
			break;
		}
	}
	return count;
}
void findNpc(size_t x, size_t y, size_t npcnum, char *npcpos) {
	int count = 0;
	vector<int> m_vec;
	int tmax = 128, maxx=0, maxy=0;
	//setPlayPos(x, y);
	count=setNpcPos(npcpos,m_vec);
	if (count != npcnum)
		return;
	for (int i = 0; i < 2*npcnum; i+=2) {
		int tx = m_vec[i] - x;
		int ty = m_vec[i + 1] - y;
		int tsum = pow(tx, 2) + pow(ty, 2);
		int tlen = sqrt(tsum);
		if (tlen < tmax) {
			tmax = tlen;
			maxx = m_vec[i], maxy = m_vec[i+1];
		}	
	}
	cout << "(" << maxx << "," << maxy<<")";
	
}

  
  
程式設計大題2:
這裡寫圖片描述
  由於做到這的時候只剩10來分鐘(時間都浪費在第一題了…),因為時間很少,腦子有些犯渾了,第一時間打算分析其規律,很顯然,這是一個離散的數列(不知道可不可以這樣形容),與其瞎找規律,還不如按照題目說的去實現,於是我就把給出的例子想成如下步驟:
    1、當n=0時,返回1。
    2、n>0時,設有一個列表,{0}與序列{0},將元素從1到k新增進入列表,每新增一個進入列表相應的就把該元素新增進入序列,然後再把新增的元素與集合中的每個元素的合新增進入序列,也就達到了題目的效果。
  由於時間不夠,這道題我沒有完成,所以與面試無緣了,本身作為18屆也沒機會去面試=_=
  PS:由於忘記截圖測試用例,我也不知道自己的程式碼對不對,只是測試了一下題目預設給的序列,目前是正確的。

程式碼:
  m_pow是為了解決重複計算pow,m_vec是存放序列,程式碼寫得很爛,這也是我目前暫時想到得方法。

vector<int> m_vec;
vector<int> m_pow;
int calsum(int num,int n) {
	static int flag = 1;
	if (n == 0) {
		return 1;
	}
	if (n == 1) {
		return num;
	}
	int sum = 0;
	int val;
	if (flag < m_pow.size())
		val = m_pow[flag+1];
	else {
		val = pow(num, flag);
	}
	m_vec.push_back(val);
	m_pow.push_back(val);
	flag++;
	for (int i = 0; i+1 < flag; i++) {
		int v = 0;
		if (i < m_pow.size()) {
			v = m_pow[i];
		}
		else {
			v = pow(num, i);
			m_pow.push_back(v);
		}
		int tmp = v + val;
		sum += v;
		m_vec.push_back(tmp);
	}
	if (flag != 2) {
		sum += val;
		m_vec.push_back(sum);
	}
	if (m_vec.size() >= n) {
		return m_vec[n - 1];
	}
	return calsum(num, n);
}

int main() {
	m_vec.push_back(1);
	m_pow.push_back(1);
	int sum = calsum(4, 10);
	cout << sum << endl;
	for (auto i : m_vec) {
		cout << i << " ";
	}
	return 0;
}

  
  
單選題
  就寫一些自己迷惑的題吧,記不太清題目了。。。
1、

int ary[]={1,2,3};
int *p=ary;
int ret=*p+*p+++*++p;

  在第一眼看到這個題,想起了網上說起的譚浩強C,雖然我沒看過,但是也聽說過,也知道這樣的寫法很不友好,但是我並沒有記下來,到底是從右邊向左邊運算呢,還是分析運算子優先順序什麼的呢?我有點方了。
  答案是6,雖然我第一時間也是選6,但是我犯渾了,後面又改成5,5是從左往右邊運算的過程orz,我覺得這種要分析的話,從彙編上看比較好…
  下面是語句的彙編程式碼,首先把p地址給eax,eax+4位元組,然後再把eax地址返回給p,也就是p++之後的操作就不解釋了,直到00A08255執行完後,也就是把值給ret後,再對P執行++語句,所以可以看出++p與p++的區別了,也知道其執行順序。

	int ret=*p+*p+++*++p;
00A0823D  mov         eax,dword ptr [p]  
00A08240  add         eax,4  
00A08243  mov         dword ptr [p],eax  
00A08246  mov         ecx,dword ptr [p]  
00A08249  mov         edx,dword ptr [ecx]  
00A0824B  mov         eax,dword ptr [p]  
00A0824E  add         edx,dword ptr [eax]  
00A08250  mov         ecx,dword ptr [p]  
00A08253  add         edx,dword ptr [ecx]  
00A08255  mov         dword ptr [ret],edx  
00A08258  mov         edx,dword ptr [p]  
00A0825B  add         edx,4  
00A0825E  mov         dword ptr [p],edx 

  
2、
  很久沒寫類繼承方面,忘了很多,當我看到這個的時候,猶豫了,我知道派生類繼承後,會存有一個類似於A的副本,畢竟要呼叫基類的建構函式,但是我這時候就糾結了,到底派生類中是否存在一個基類的物件,而這個物件是否會呼叫解構函式,忘乾淨了,於是乎就選了只輸出類B的解構函式。

class A {
public:
	~A() {
		cout << "this a\n";
	}
};

class B :public A {
public:
	~B() {
		cout << "this B";
	}
};
int main() {
	
	B t;
	return 0;
}

  答案是先輸出B的,再輸出A的,看看彙編就知道了(這兩個月沒白學…雖然拖得時間長了些…)
  再main函式中只顯示call B::B,沒看到A!沒關係逐語句除錯進去看,就會發現除了呼叫B,之後還會呼叫A,再詳細看就是下下面得彙編程式碼,也可以看到C++中的class大概佈局,執行完B後縮棧,然後再呼叫A,似乎他們就是同步的,而其原因是其構造順序決定的。

B::~B:
01011A05  jmp         B::~B (01015FC0h)  
A::~A:
01011A0A  jmp         A::~A (01015CC0h)  
class B :public A {
	~B() {
01015FC0  push        ebp  
01015FC1  mov         ebp,esp  
01015FC3  push        0FFFFFFFFh  
01015FC5  push        1024610h  
01015FCA  mov         eax,dword ptr fs:[00000000h]  
01015FD0  push        eax  
01015FD1  sub         esp,0CCh  
01015FD7  push        ebx  
01015FD8  push        esi  
01015FD9  push        edi  
01015FDA  push        ecx  
01015FDB  lea         edi,[ebp-0D8h]  
01015FE1  mov         ecx,33h  
01015FE6  mov         eax,0CCCCCCCCh  
01015FEB  rep stos    dword ptr es:[edi]  
01015FED  pop         ecx  
01015FEE  mov         eax,dword ptr [__security_cookie (0102D014h)]  
01015FF3  xor         eax,ebp  
01015FF5  push        eax  
01015FF6  lea         eax,[ebp-0Ch]  
01015FF9  mov         dword ptr fs:[00000000h],eax  
01015FFF  mov         dword ptr [this],ecx  
01016002  mov         ecx,offset _749050E7_hello.cpp (0103000Dh)  
01016007  call        @[email protected] (010115C3h)  
		cout << "this B";
0101600C  push        offset string "this B" (01028C8Ch)  
01016011  mov         eax,dword ptr [[email protected]@@[email protected][email protected]@[email protected]@@[email protected] (0102E0CCh)]  
01016016  push        eax  
01016017  call        std::operator<<<std::char_traits<char> > (010114A1h)  
0101601C  add         esp,8  
	}
0101601F  mov         ecx,dword ptr [this]  
01016022  call        A::~A (01011A0Ah)  
01016027  mov         ecx,dword ptr [ebp-0Ch]  
0101602A  mov         dword ptr fs:[0],ecx  
01016031  pop         ecx  
01016032  pop         edi  
01016033  pop         esi  
01016034  pop         ebx  
01016035  add         esp,0D8h  
0101603B  cmp         ebp,esp  
0101603D  call        __RTC_CheckEsp (010115FFh)  
	}

  
3、
  繼承關係,這裡我忘記了一件事,私有繼承的話,所有成員都不可見,這裡忘了,的確不太應該,該好好回想C++了…emmmmmm
  這裡寫圖片描述
  
  
4、
  這個我好像沒選錯,但是值得記一下…

class A {
public:
	int a;
	A(int val = 0) {
		a = val;
	}
	friend  void operator++(A &m) {
		m.a++;
	}
};

  關於過載,好像記得題目給得不清,讓答題者選友元函式是怎麼呼叫的。
  因為++是單目運算子,一個引數即可,但這是前置++的寫法(++A),題目好像沒說明是後置還是前置++,還是我忘了= =
  如果後置的話,需要新增下面這種,有點類似於用友元函式過載輸入輸出運算子(二目),就可以使用A++了,相當於++從左邊傳入引數_

friend  void operator++(A &m,int) {
		m.a++;
}

  
5、
好像沒有印象深刻的題了,想起在補充吧。

相關推薦

暢遊試題小記

  今天收到暢遊的線上筆試,就打算來試試了,就當去校招前練練手,因為暢遊校招只招19屆…ORZ   暢遊的題很奇怪,分為兩大類,第一類與遊戲相關的基礎題和閱讀理解(中間涉及一些小計算),第二類就是程式設計相關的單選題以及程式設計大題。   不討論基礎題,只是論程

試題

字符串復制 不可 方式 父類 進程切換 find 成員函數 quest comm 1.以下三條輸出語句分別輸出什麽? int main (void) { char str1[] = “abc”; char str2[] = “abc”; cons

牛客網試題總結

1、關於history物件的屬性和方法的描述 length      返回瀏覽器歷史列表中的URL數量 back()      載入 history 列表中的前一個URL forward() 載入 history 列表中的下一個URL go()         載入h

一個月刷完機器學習試題300(9)

第九天 1、對於下面三個模型的訓練情況, 下面說法正確的是: 第一張圖的訓練錯誤與其餘兩張圖相比,是最大的 最後一張圖的訓練效果最好,因為訓練錯誤最小 第二張圖比第一和第三張圖魯棒性更強,是三個裡面表現最好的模型 第三張圖相對前兩張圖過擬合了 三個圖

一個月刷完機器學習試題300(8)

第八天 1、對於下圖, 最好的主成分選擇是多少 ? A 7 B 30 C 35 D Can’t Say 正確答案是: B 主成分選擇使variance越大越好, 在這個前提下, 主成分越少越好。 2、資料科學家可能會同時使用多個演算法(模型)進行預測, 並且最後把這些演算法的結果整合起

一個月刷完機器學習試題300(7)

第七天 1、使用k=1的knn演算法, 下圖二類分類問題, “+” 和 “o” 分別代表兩個類, 那麼, 用僅拿出一個測試樣本的交叉驗證方法, 交叉驗證的錯誤率是多少: A 0% B 100% C 0%到100 D 以上都不是 正確答案是: B knn演算法就是, 在樣本週圍看k個樣本

一個月刷完機器學習試題300(6)

第六天 61、bootstrap資料是什麼意思?(提示:考“bootstrap”和“boosting”區別) A 有放回地從總共M個特徵中抽樣m個特徵 B 無放回地從總共M個特徵中抽樣m個特徵 C 有放回地從總共N個樣本中抽樣n個樣本 D 無放回地從總共N個樣本中抽樣n個樣本 正確答案是

一個月刷完機器學習試題300(5)

第五天 1、下列方法中,不可以用於特徵降維的方法包括 A 主成分分析PCA B 線性判別分析LDA C 深度學習SparseAutoEncoder D 矩陣奇異值分解SVD 正確答案是:C 特徵降維方法主要有: PCA,LLE,Isomap SVD和PCA類似,也可以看成一種降維方法 L

一個月刷完機器學習試題300(4)

第四天: 1、下列時間序列模型中,哪一個模型可以較好地擬合波動性的分析和預測。 A AR模型 B MA模型 C ARMA模型 D GARCH模型 解析:AR auto regressive model AR模型是一種線性預測 MA模型(moving average model)滑動平均模

一個月刷完機器學習試題300(2)

第二天 1、一個二進位制源X發出符號集為{-1,1},經過離散無記憶通道傳輸,由於通道中噪音的存在,接收端Y收到符號集為{-1,1,0}。已知P(x=-1)=1/4,P(x=1)=3/4,P(y=-1|x=-1)=4/5,P(y=0|x=-1)=1/5,P(y=1|x=1)=3/4,P(

一個月刷完機器學習試題300

第一天 1、以下哪種方法屬於判別式模型(discriminative model)( ) A 隱馬模型(HMM) B 樸素貝葉斯 C LDA D 支援向量機 正確答案是:D 已知輸入變數x,判別模型(discriminative model)通過求解條件概率分佈P(y|x)或者直接計算y

騰訊秋招web後臺方向試題第二,尋找重要城市,dfs解法。

問題描述:       小Q所在的王國有n個城市,城市之間有m條單向道路連線起來。對於一個城市v,從城市v出發可到達的城市數量為x,從某個城市出發可達到的城市v的城市數量為y,如果y>x,則城市v是一個重要城市(間接可達也算可以到達)。       小Q希望你能

一個月刷完機器學習試題300(17)

第17天 1、下面是三個散點圖(A,B,C,從左到右)和和手繪的邏輯迴歸決策邊界。 正則化項懲罰度最高的是? A A B B C C D 都具有相同的正則化 正確答案是:A 因為正則化意味著更多的罰值和圖A所示的較簡單的決策界限。 2、下圖顯示了三個邏輯迴歸模

一個月刷完機器學習試題300(19)

第19天 1、下圖顯示了三個邏輯迴歸模型的AUC-ROC曲線。不同的顏色表示不同超引數值的曲線。以下哪個AUC-ROC會給出最佳結果? A 黃色 B 粉紅色 C 黑色 D 都相同 正確答案是:A 最佳分類是曲線下區域面積最大者,而黃線在曲線下面積最大 2、假設

2017網易遊戲程式設計試題·第一

題目描述: 目前有一款益智小遊戲,對經典的吃豆子游戲進行了改編。玩家將在類似如下圖中所示的網格地圖中進行遊戲,當玩家將所有的“豆子”吃完後,遊戲便結束。具體的遊戲規則如下: 1.玩家在遊戲開始後,出生在地圖的左上角,且面朝右側。 2.玩家每次只能移動一格,移動的方式只能從

騰訊2016春招模擬試題 —— 程式設計(3道)

寫在前面的話~       春招 + 模擬筆試  【C++研發】       模擬筆試時間是    2016-03-25   21:30 ~ 22:30          試題主要包括兩部分:不定項選擇 + 程式設計  分別計時 時間都是30分鐘。(逃~。。。      

面試試題總結 不斷更新中。。。。。。

1.下面會引起程序建立的事件是()。 正確答案: A C 你的答案: A (錯誤) 使用者登入 裝置中斷 作業排程 執行系統呼叫 導致一個程序建立另一個程序的典型操作有四種: 1 使用者登入;系統為使用者建立一個程序,並插入就緒佇列 2 作業排

2016阿里實習線上試題-附加1-隨機數生成器

隨機數生成器 計算機使用的隨機數生成器往往是偽隨機的,為了達到統計意義上的真隨機數,可以需要引入系統 外的變數等作為隨機種子(如UNIX系統中熵池)。假設有一天出現了上帝的投硬幣函式: int G(); 由於這裡用到的上帝硬幣可能不均勻。但可以保證是G()

百度2018春招 演算法工程師試題--程式設計2--爬山

這次百度演算法工程師筆試題中的兩個程式設計題目,第一個是排列組合問題,很鬧心,耗費了不少時間,搞得第二道也沒做完,平時還是要多練習呀。題目: 爬山內容:冬木市西邊的園藏山是著名的旅遊勝地。從空中俯瞰,園藏山可以看成一個n*m的矩陣,我們把行從上往下按1到n編號,把列從左到右按

搜狐2015年10月18日線上試題第一道答案

考的的是約瑟夫環,還是挺簡單的, 15個教徒和15個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了一個辦法:30個人圍成一個圓圈,從第一個人開始報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問教徒怎麼站,才能使每次投入大