這是一位同學阿里的一面,也是投的算法實習崗,不過問的題目與我很不同,拿來學習一下。
算法題:
- 輸入一個數列,有N個整數,可以將任意區間內的所有整數相加,求相加之和的最大值。
這是一道簡單的動態規劃的題,設狀態變量dp[i]表示加至下標i處,最大累和值。可知遞推方程是dp[i]=max{dp[i-1]+arr[i],arr[i]}。arr爲數列,可以知道如果加上當前arr[i]都沒有arr[i]大,那麼arr[i]是個比較大的復值,前面就算有正的和,也被抵消掉了。代碼如下:
class Solution:
def maxSum(self, nums:list) -> int:
dp = [0]*len(nums)
dp[0]=nums[0]
for i in range(1,len(nums)):
dp[i]=max(nums[i],dp[i-1]+nums[i])
return max(dp)
if __name__ == '__main__':
nums = [0,2,3,-1,4,5,-8,-3,7]
solution = Solution()
result = solution.maxSum(nums)
print(result)
- 青蛙跳臺階:一隻青蛙一次可以跳上1級臺階,也可以跳上2級臺階。求該青蛙跳上一個n級的臺階總共有多少種跳法?
這是一道劍指Offer的原題,是一道遞歸的題目,設f(n)是n級臺階會有的跳法,那麼f(n)=f(n-1)+f(n-2),很明顯這就是個斐波那契數列的問題,初始條件f(0)=0, f(1)=1, f(2)=2。這裏考慮用帶備忘錄的遞歸方法求解,避免重複計算。
class Solution:
def numOfJump(self, n) -> int:
memo = {1:1,2:2}
def f(step):
if step not in memo:
memo[step] = f(step-1)+f(step-2)
return memo[step]
return f(n)
if __name__ == '__main__':
n = 1000
solution = Solution()
result = solution.numOfJump(n)
print(result)
簡歷上的問題:
這方面問得很奇怪,同學的方向是DL做CV,好像問得相關的只論文以及LR的原理,其他都是些計算機專業基礎知識,不過應該都跟阿里雲的技術相關吧。
- LR:這裏指的是logistic regression。這個算法我比較深入的理解是從吳恩達老師的DL課程開始的,這裏麪包含有LR的損失函數的由來、LR如何使用梯度下降來優化參數等知識點,不過面試要問的點可能更加深入,不妨看看算法工程師基礎問答。
參考資料:
吳恩達—DL微課程
邏輯迴歸的常見面試點總結 - 三次握手、四次揮手(計算機網絡):本科學的知識如果當初建立了感性上的認識,原理撿起來會比較快。這裏主要有兩個問題:三次握手爲什麼是三次?問題出現在客戶端首次發送連接請求的報文可能丟失,導致客戶端已經不打算連接了,而服務器端卻接收到延遲後的報文建立連接,造成的資源浪費;四次握手爲什麼是四次,爲什麼最後還要等待個2MSL時間?四次握手是爲了能夠讓客戶端在斷開請求後還能夠接收到未接收完的數據,等待2MSL時間問題出現在最後一次報文可能出現丟失或延遲,但報文的生存時間只有1MSL,這可以讓服務器能夠重發FIN報文,而客戶端有足夠的時間發送ACK報文迴應過去,而完完全全地結束TCP連接。
參考資料:
面試官,不要再問我三次握手和四次揮手 - 線程與進程的區別(操作系統):我一直的理解就是進程=線程+資源。線程是在進程裏建立的,
很明顯的表現就是我把谷歌瀏覽器關閉了,裏面的網頁程序就都關了(谷歌瀏覽器其實是多進程的,這是因爲進程在安全性上更有保障)。線程共享進程裏的資源,去執行自己的邏輯完成任務。多線程技術一來能充分利用CPU資源,二來能各幹各的事。
參考資料:
進程與線程的區別 - 網絡攻擊有哪些:這是網絡安全方面的問題,我確實瞭解不多,不過我記得有一種攻擊叫Dos,就是瘋狂地往服務器發送訪問請求,把服務器的資源耗盡了,造成別的客戶都不能訪問。更深入的知識可以看看網絡攻擊類型,雖然只有Dos,DDos,DRos三種攻擊,但卻非常巧妙。
如果覺得不錯,請素質三連哈~~