昨天面了網易互娛的遊戲研發工程師,回想下彷佛問的問題並很少,總體也就 5 個問題,但每一個問題展開以後裏面的量好像也很多,如今整理一下,順便解決下面試中沒答上來的地方。python
先是自我介紹。。。。。面試官瞭解到我對 Python 更加熟悉一些,因而問了比較多的 Python 相關的問題。ios
面試官:在 C++、Java中,定義一個類,其成員能夠申明爲 public、private、protected, 那麼在Python 中如何實現類成員的 public、private、protected
答:Python 語言並不存在控制訪問,因此沒法直接定義類成員的 pubilc、private等屬性,通常狀況下是經過命名規約來達到這個效果,對於 private 的成員,通常命名以 _
開頭,而 public 的則正常命名便可。c++
面試官:那對於雙下劃線__
開頭的成員呢?web
答:雙下劃線開頭的成員感受主要是用在類的繼承的時候,若是不想子類直接訪問到父類的這個成員,則能夠以雙下滑線開頭。(修正,不只僅是繼承的時候,在該類中定義了雙下劃線開頭的成員,實例化的對象也沒法直接訪問該成員)面試
面試官:若是我訪問了這個雙下劃線開頭的成員,會報什麼錯誤?算法
這裏我忽然就愣住了,由於以前都沒去嘗試過,愣了一下子以後,面試官給了些提示,若是你訪問一個變量,但這個變量沒有定義的話,那會報什麼錯誤?後端
答:應該是變量不存在吧數組
面試官:那上面那個問題是報什麼錯誤呢?數據結構
答:這麼一說感受應該是變量不存在機器學習
面試官:那再問問若是我非要訪問這個雙下滑線開頭的成員,要怎麼作?
這裏真就不會了 orz
如今來補一下
''' @Description: @Author: 妄想 @Date: 2020-05-29 15:28:30 @LastEditTime: 2020-05-29 15:32:52 @LastEditors: 妄想 ''' class base: def __init__(self): self.public = 1 self._internal = 2 self.__private = 3 def public_method(self): print('public method') def _internal_method(self): print('internal method') def __private_method(self): print('private method') b = base() print(b.public) print(b._internal) print(b.__private)
運行一下
那我該如何訪問它呢?查了下資料,發現雙下劃線開頭的成員,會被重命名,變成 _類名
+ 成員名,在這裏就是b._base__private
print(b.public) print(b._internal) print(b._base__private)
函數也是相似
面試官:瞭解過修飾器嗎?
答:瞭解過
面試官:介紹下 Python 中修飾器(問題大概就是這個意思吧)
答:balabalabala。。。。(大體意思就是減小代碼重複,封裝成裝飾器方便使用,相似於函數)
面試官:那一個裝飾器的輸入和輸出是什麼呢?
答:輸入?能夠是任意的參數吧,這個不是根據實際定義的嗎?(這裏我理解錯了面試官的意思了- - ,由於以前在作 web 後端的時候,用了修飾器來作 token 驗證,當時將 token 做爲一個參數使用了)後面在面試官的引導下,反應過來了,輸入和輸出都是函數。
面試官:若是我不採用 @修飾器名稱 的方式來調用修飾器,那該怎麼作?
答:我印象中是直接當作函數調用就行了,可是好像並沒成功 orz 。。
先來個通常寫法
def foo(f): def inner(): print('inner') return f return inner @foo def bar(): pass bar()
會發現輸出了 inner,而後我當時寫了這樣的調用
def foo(f): def inner(): print('inner') return f return inner def bar(): pass foo(bar)
發現沒輸出 orz, 而後就過去了,後來仔細想一想,雖然說返回的是函數,但只是這個函數名啊,我並無調用它哪來的輸出啊,菜哭。。
改爲這樣就行了
bar = foo(bar) bar() # 或 foo(bar)()
面試官:瞭解過迭代器嗎?能夠介紹下嗎?
答:迭代器通常是用在對 Python 中的數據結構進行遍歷,好比我如今有一個名爲 li 的 List,我想對裏面每一個元素進行修改,那就須要遍歷每一個元素,這時經過 for number in li:
這條語句,便會生成一個迭代器,而後 number 爲當前所在位置的元素。
面試官:那這跟直接索引遍歷相比的好處是什麼?
答:(這裏憑感受答的,也不清楚對不對)1. 按索引遍歷的話首先須要知道這個數據結構的長度。2. 每次遍歷的時候都須要經過索引來獲取這個數據,而經過迭代器可直接獲取到數據。
面試官:那有沒有什麼狀況下是不能使用迭代器的呢?
答:這裏我以爲存在刪除操做的時候應該是不能使用迭代器的,以下面這段代碼, 我想刪除列表中大於 3 的元素
li = [1, 2, 3, 4, 5, 1, 4] for i in li: if i > 3: li.remove(i) print(li)
輸出一下發現結果爲 [1, 2, 3, 5, 1]
面試官:那添加的時候呢?
答:添加的狀況沒遇到過,不太清楚,但感受應該也不太行。(我的感受,通常來講添加是須要知足某種狀況才進行添加,可是在迭代過程當中進行添加,會致使迭代器需迭代的元素不斷增長,若是操做不當可能會陷入死循環)。
本覺得結構體對齊很簡單的,然而。。我天真了 - -
面試官:那接下來問問 C++ 方面的內容,瞭解過結構體的對齊嗎?
答:瞭解過, balabalabala。。。。
面試官:那來算一下這個結構體的大小吧
struct Node { short a; long b; char c; char d; int e; int f; short i; short j; long k; };
答:(算就算吧),算了一下子,算出來一個 34 字節
面試官:怎麼得出來的
答:首先 short 佔 2 字節, 而後 long 佔 8 字節, 後面加起來總共是 22 字節,對齊一下就是 24 字節,加起來總共 34 字節。(後來驗證了下,發現本身錯了 orz)
面試官:你肯定這裏第一個 short 只佔 2 字節嗎?
答:balabalabala。。。(我還以爲本身很對,後來下來驗證了下發現本身打錯了 orz)
面試官:這裏操做系統是怎麼讀取數據的?一次能讀兩個字節嗎?
答:(這裏我已經懵逼了)emmmmm。。。不太清楚。。我記得這裏應該是讀取一個起始位置 + 偏移量來獲取這個數據。
面試官:下去以後有興趣再去了解了解吧
這裏開始補充,發現 mingw64 long只佔 4 個字節???
/* * @Description: * @Author: 妄想 * @Date: 2020-05-29 16:42:59 * @LastEditTime: 2020-05-29 16:54:49 * @LastEditors: 妄想 */ #include<iostream> #include<stdio.h> using namespace std; struct Node { short a; long long b; char c; char d; int e; int f; short i; short j; long long k; }; // 2 + 8 + 22 // 34 int main(){ printf("%d\n", sizeof(Node)); printf("%d %d %d %d %d %d %d %d %d\n", &Node::a, &Node::b, &Node::c, &Node::d, &Node::e, &Node::f, &Node::i, &Node::j, &Node::k); printf("char:%d, short:%d, int:%d, long:%d, long long:%d\n", sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long)); return 0; }
看一下輸出
這個 long 只佔 4 字節有點迷,沒辦法,就先改爲 long long 吧。
能夠發現,變量 b 的起始位置是 8 而不是 2,e 的起始位置是 20 而不是 18。
查了下相關博客:
面試官:接下來問問算法方面的東西吧,說一說快排的流程。
答:(很尷尬。。。已經好久沒有接觸過排序算法了,近期準備面試也沒看過排序方面的東西,因此想了一段時間,好歹仍是想起來了) balabalabala。。。。
面試官:那時間複雜度呢?
答:最差 \(O(n^2)\) ,平均 \(O(n\log n)\)
面試官:什麼狀況下最差呢?
答:數組徹底逆序排序的時候
面試官:那怎麼選取主元能使得快排的性能最好呢?
答:(這個以前在算法導論上看到過,然而已經忘了。。。想了想,若是說每次劃分正好在數組的正中間,那麼可達一個較優的狀況因此就答了中位數)
面試官:那再問問其餘問題,有了解過其餘最差狀況不會像快排這樣的排序算法嗎?
答:(這裏感受面試官問的應該是穩定的排序算法有哪些,當時能想起來的就是歸併排序結果一不當心答成分治排序 - -)
補充:從別的地方拿來的圖
寫了道鏈表翻轉,結果很尷尬,忘了將翻轉後的鏈表最後一個元素的 next 設置爲空,致使一直超時 orz 。。。。。過程當中邊 debug 邊跟面試官討論,最後改出來了。。害,過久沒手寫過數據結構了,這麼一道簡單的題還寫出 bug。。。哭了
問了下想到網易作遊戲開發須要學些什麼(畢竟當年是想作遊戲開發才選的計算機,並且大一剛入學的目標就是網易遊戲,雖而後來搞了近兩年機器學習。。),面試官說是並無太期望應屆生有遊戲開發相關的知識,要求就是基礎要紮實,可以作到他們交給咱們的東西咱們能學會。(不說了,接着補基礎去了。。。)
一次體驗極好的面試,總共面了一個小時多一點,過程當中有答不上來的地方面試官會慢慢引導本身,結束以後感受好像答的還不錯,梳理一下發現問題仍是有點多 orz。。面試以前看了很多網易遊戲研發的面經,照着面經準備了幾天,發現被問到的面經上都沒出現,真就全靠平時積累。。。看來還有好多地方須要補一補。。說是一週內會出結果,只能看命了。。
從三月份開始投算法崗,一直到以前改投開發崗,掛了無數次,看着周圍一些同窗都拿了很多 offer,壓力有點大。。