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