2019騰訊實習筆試題部分記錄+兩次電話面試筆記

Frankenstein_Quasimo發表於2019-03-22

第一題:有n層的一座塔,跳塔

有n層的一座塔,每層高度不一樣,現在小Q去爬塔,有如下特性:他爬塔的速度恆定,也就是說爬每一層的用時和這一層的高度成正比。但是他有一個能力:他可以有一種魔法,這個魔法可以跳過一層或者兩層塔,但是每跳躍一次,都要停下來爬至少一層才能繼續跳躍。需要你規劃出一條方案,讓他能夠最短的時間爬到塔頂(最後如果跳躍,可以選擇越過塔頂,也就是說如果最後倒數第二層是走完的,直接跳到頂就完事了)
輸入:兩行資料,第一行:塔層數;第二行,每層高度,用空格隔開。如:
4
2 5 2 6
輸出:總計用時
思路:最優路徑問題一直是個難題,拿到題的第一反應就是用遞迴或者Huffman樹的思路求解。貪心法是不合適的,因為貪心法不能保證最優解。想到了一種暴力測試的方法:根據每層的順序構造二叉樹,每層都可以選擇跳或者不跳,分別對應左右子樹。最終得到層數為n的滿二叉樹。從頂到底的搜尋過程對應著一條路徑,這個滿二叉樹不是所有分支都是合題意的,所以根據規則:連續跳躍的層數不得超過2,也就是連續兩層的跳躍可以看做一次跳躍。這樣就可以砍掉一些分支。然後遍歷一遍從根節點到葉子結點,每次遍歷都是一個方案路徑的實現,這樣就窮舉出來了所有的可能方案,遍歷過程計算“爬”的長度。
PS:第一階段構造樹、第二階段砍掉不必要分支、第三階段遍歷計算、最後查詢最小值。後續可以把構造樹和砍掉分支的操作合併到一起去,可以提高演算法執行效率。想到解法的時候沒時間了,算了放棄。後續有空寫出來(但是應該是沒空)

第二題:沒看懂題,就是黑白格數格子,忘了

第三題:約瑟夫環

小Q有n張牌,分別是1~n;現在要把第一張牌放到最底下然後再把頂層的牌拿開,直到只剩一張。求拿開牌的順序。
(我基本沒做過什麼筆試面試題,湊巧我知道這個題)

int main(int argc, _TCHAR* argv[])
{
	int num  = 0;
	cin >> num;
	queue<int> q;
	vector<int> out;
	for (int i = 0; i < num; i++) {
		q.push(i+1);
	}
	while (q.size() > 1) {
		out.push_back(q.front());
		q.pop();
		if (q.size() != 1) 
		{
			q.push(q.front());
			q.pop();
		} else {
			break;
		}
		
	}
	out.push_back(q.front());
	for (int i = 0; i < out.size(); i++) {
		printf("%d ", out[i]);
	}
	return 0;
}

第三題:2019年3月19日08:56:15幹活了,題目描述以後再寫,看下面就知道要做什麼了

void answer(vector<vector<int>> vec, int num_i, int min_, int& ans, int& idx) {
	ans = min_;
	for (int i = 0; i < num_i; i++) {
		for (int j = 0; j < num_i; j++) {
			if (vec[i][j] < ans && vec[i][j] >= 0) {
				ans = vec[i][j];
				idx = i;
			}
		}
	}
}
int main() {
	int n;
	double num;
	vector<vector<int>> vec;
	cin >> n;
	vector<int> nums;
	for (int i = 0; i < n; i++) {
		double num;
		cin >> num;
		nums.push_back(num);
	}
	for (int i = 0; i < n; i++) {
		vector<int> sub;
		for (int j = 0; j < n; j++) {
			sub.push_back(-1);
		}
		vec.push_back(sub);
	}

	for (int i = 0; i < vec.size(); i++) {
		for (int j = i+1; j < n; j++) {
			vec[i][j] = abs(nums[i] - nums[j]);
		}
	}

	int min_ = -1;
	for (int i = 0; i < n; i++) {
		if (nums[i] > min_)
			min_ = nums[i];
	}
	
	for (int i = 2; i <= n; i++) {
		int ans;
		int  idx;
		answer(vec, i, min_, ans, idx);
		printf("%d %d\n", ans, nums[idx]);
	}
	return 0;
}

第一次電話面試筆記

這個環節講道理不該講的,但是我還是貼出來給其他人蔘考吧。
自我感覺筆試是很爛的,因為最近忙著準備文章進度跟蹤和開題材料的準備。(插一句:筆者普通本科計算機專業(重點院校的同學們請不要秀優越感,謝謝),碩士讀光學,從事三維測量、三維重建、影像處理的研究,最近沉迷深度學習不能自拔)
收到面試邀請我是很意外的,因為最近一直在看書,程式設計手生了,而且裸考(我不管考啥都是裸考),筆試做的很爛,投的技術研究TEG-計算機視覺,14:1的報錄比。於是乎約定當晚7點半進行電話面試。


開始:我主動問了下面試一般視場,如果時間緊我就長話短說,電話那頭(不知道是不是HR)說:一般20~30分鐘(最終我面了38分鐘。。),但是沒有具體的時間限制。讓我自我介紹,我內心:????我簡歷不是都有咩?不知道為啥據說所有HR都喜歡來這麼一套,我就挑重點把老本行+現在專業+主攻方向說了說。我還順便提了下我的愛好:攝影,插一句:雖然我窮,但是還是喜歡攝影。然後讓我說一下我簡歷裡那麼多實踐經驗,挑一個最深刻的,我:動車庫檢機器人專案,畢竟是我研究生階段的主要工作。。一套裝置一百萬呢(雖然鐵路上幾千萬的裝置很常見),於是乎一通描述,大概描述了一下 現階段都是結構光、TOF、雙目…反正都是三角測量原理,


實踐專案過程中,印象最深的一次經歷,也就是理論和實踐發現不一樣的時候怎麼解決,說一個就行。那就很多了,我就剎不住了。


專案實踐過程中遇到問題怎麼定位問題並且解決。其實說真的,沒有固定的方法,真讓我說方法我也就只能說一些簡單的,遇到的問題五花八門,而且根源也都不一樣,有些是機械的鍋有些是電氣的鍋有些是軟體的鍋,反正我們做演算法的沒有鍋,有鍋也不承認(手動狗頭)。


你有一篇文章:動態構造二叉樹…講一下主要做了些什麼,為什麼要這麼做?
背景:balabala,所以從Huffman樹得到啟發…就可以儘量…然後達到這個效果。這麼做的原因很單純:當初學C++學OpenCV時候光學不練非好漢 ,就把這個實現了,練練手,然後順便投了一篇文章(而且和我課題無關,學校還不認。小聲bibi)


有沒有了解貼圖、手機美顏之類的
有,感覺挺好玩,之前自己做過一點。語義分割然後貼圖。


我們其實 不光有遊戲、社交這些業務,也有自動駕駛的研究 ,除了你們用的工業相機外,有沒有了解過手機相機、攝像頭這些在自動駕駛、AR、VR上的應用。
有啊,不過手機這種攝像頭和我們用的工業相機不一樣。。。之前有自己嘗試過做手機相機的標定,然後發現。。。etc


你對自己工作的要求是什麼:我對計算機視覺比較感興趣,也對手機相機感興趣,所以想做和手機相機或者計算機視覺、影像處理相關的工作。


後來接到一個電話,希望我去深圳總部現場面試,問有沒有時間。我看,有戲啊。但是比較忙,於是乎只能等安排再來一次電話面或者視訊面。


第二次電話面試

是一個做移動客戶端的大哥。告訴我上一個面我的是做計算機視覺的大哥。我看我後臺簡歷投遞已經變成了移動客戶端開發。這次面試算是比較失敗的。所以就只是簡單說下感想:裸考的壞處,資料結構長時間不碰忘了,只是都還有印象,概念都忘了。這位大兄弟建議我跟著做客戶端,他的團隊也有做視覺最後轉過去的。
說:當前計算機視覺競爭很激烈,剛才才面過一個也是做這方面的,國內如果想做這個還是最好是一些大的實驗室。問我是不是能接受做客戶端。我:我知道我現在的水平做計算機視覺可能能力不夠,但是我比較喜歡這個東西,所以我希望做手機影像相關的工作可以不脫離這個領域,會慢慢努力,希望在這個領域有些進步。手機客戶端之前做過一些(一週),感覺如果只是拖UI拽控制元件的話,可能我做不下去。這位大哥安慰我:…其實面試已經結束了,我們總希望自己的工作能夠和公司的需求能夠match,但是這種情況是可遇不可求的。更多的情況是你自己做出取捨去滿足公司的需求,我的團隊就有幾個…所以,繼續加油。
說實話,突然覺得鵝廠的人挺暖的。

相關文章