1. 程式人生 > >2019秋招面經記錄帖

2019秋招面經記錄帖

2019秋招面經-主網際網路篇

  • 阿里巴巴C++研發崗電話面掛經
  • 西門子-實習面經
  • 網易筆試題

    1、阿里巴巴C++研發崗

    阿里真的是突如其來的電話面試啊,還沒咋準備就開始了……
    先挖個坑,有空補一下。

  • STL瞭解多少,具體實現方式
    準備不充分,只答出了vector、string,問到vector實現方式就有點蒙了

  • 虛擬函式
  • 多型與繼承
  • 哪種排序演算法效能最好,具體實現方法
    快速排序、堆排序與歸併排序的平均時間複雜度均為O(nlogn),快速排序與堆排序是不穩定的排序演算法,歸併排序是穩定的排序演算法。
    快速排序的思想是分治,把待排序序列分成多個子序列再進行排序。通過一輪的排序將序列分割成獨立的兩部分,其中一部分序列的關鍵字(這裡主要用值來表示)均比另一部分關鍵字小。繼續對長度較短的序列進行同樣的分割,最後到達整體有序。在排序過程中,由於已經分開的兩部分的元素不需要進行比較,故減少了比較次數,降低了排序時間。
    詳細描述

    :首先在要排序的序列 a 中選取一箇中軸值,而後將序列分成兩個部分,其中左邊的部分 b 中的元素均小於或者等於 中軸值,右邊的部分 c 的元素 均大於或者等於中軸值,而後通過遞迴呼叫快速排序的過程分別對兩個部分進行排序,最後將兩部分產生的結果合併即可得到最後的排序序列。

    “基準值”的選擇有很多種方法。最簡單的是使用第一個記錄的關鍵字值。但是如果輸入的陣列是正序或者逆序的,就會將所有的記錄分到“基準值”的一邊。較好的方法是隨機選取“基準值”,這樣可以減少原始輸入對排序造成的影響。但是隨機選取“基準值”的開銷大。

    為了實現一次劃分,我們可以從陣列(假定資料是存在陣列中)的兩端移動下標,必要時交換記錄,直到陣列兩端的下標相遇為止。為此,我們附設兩個指標(下角標)i 和 j, 通過 j 從當前序列的有段向左掃描,越過不小於基準值的記錄。當遇到小於基準值的記錄時,掃描停止。通過 i 從當前序列的左端向右掃描,越過小於基準值的記錄。當遇到不小於基準值的記錄時,掃描停止。交換兩個方向掃描停止的記錄 a[j] 與 a[i]。 然後,繼續掃描,直至 i 與 j 相遇為止。掃描和交換的過程結束。這是 i 左邊的記錄的關鍵字值都小於基準值,右邊的記錄的關鍵字值都不小於基準值。

    通過兩個不相鄰元素交換,可以一次交換消除多個逆序,加快排序速度。快速排序方法在要排序的資料已經有序的情況下最不利於發揮其長處。

#include <stdio.h>

#define MAX_NUM 80

void quicksort(int* a, int p,int q)
{
    int i = p;
    int j = q;
    int temp = a[p];

    while(i < j)
    {
        // 越過不小於基準值的資料 
        while( a[j] >= temp && j > i ) j--;

        if
( j > i ) { a[i] = a[j]; i++; // 越過小於基準值的資料 while(a[i] <= temp && i < j ) i++; if( i < j ) { a[j] = a[i]; j--; } } } a[i] = temp; for(int k = p; k <= q;k++) { if( k == i ) { printf("(%d) ",a[k]); continue; } printf("%d ",a[k]); } printf("\n"); if( p < (i-1)) quicksort(a,p,i-1); if((j+1) < q ) quicksort(a,j+1,q); } int main(int argc, char* argv[]) { int a[MAX_NUM]; int n; printf("Input total numbers: "); scanf("%d",&n); if( n > MAX_NUM ) n = MAX_NUM; for(int i = 0; i < n;i++) { scanf("%d",&a[i]); } printf("Divide sequence:\n"); quicksort(a,0,n-1); printf("The sorted result:\n"); for(int i = 0; i < n;i++) { printf("%d ",a[i]); } printf("\n"); return 0; }

快速排序的執行時間與分解是否對稱有關,而後者又與選擇了哪一個元素來進行劃分有關。如果劃分是對稱的,則執行時間與歸併排序相同,為Θ(n lg n)。如果每次分解都形成規模為n-1和0的兩個子問題,快速排序的執行時間將變為Θ(n2)。快速排序的平均情況執行時間與其最佳情況相同,為Θ(n lg n)。
- 堆與棧的區別

2、西門子實習面經

投了大資料開發部和資訊保安部門,最後去了資訊保安,大資料開發被刷。

  • 大資料開發部門
    主要做深度學習,先問了我的專案內容,然後所做的演算法。機器學習問了個各種激勵函式的選取方法。
  • 資訊保安部門
    問的比較全面。首先是linux中檢視程序的指令;查詢有什麼方法;排序有什麼方法;是否瞭解雲端計算,web開發;python中字典的實現方法(可能只是實習所以問的都挺水的)

    3、網易筆試題

    選擇題非常多,涉及的面也很廣。重點記錄:快排、二分查詢等資料結構方法的效能;socket網路程式設計;linux中非root使用者為什麼可以管理密碼;linux網路介面在哪個檔案
    程式設計題三道,都還挺難的,之後記錄
    問答題兩道:1、template中引數型別。2、如何記錄唯一id,方便刪減(連結串列)
    整體答得不好,估計會掛……

資料庫知識點總結

Mongodb特點:

  • 高效能、易部署、易使用,儲存資料非常方便。主要功能特性有:
  • 面向集合儲存,易儲存物件型別的資料。
  • 模式自由。
  • 支援動態查詢。
  • 支援完全索引,包含內部物件。
  • 支援查詢。
  • 支援複製和故障恢復。
  • 使用高效的二進位制資料儲存,包括大型物件(如視訊等)。
  • 自動處理碎片,以支援雲端計算層次的擴充套件性
  • 支援Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅動程式,社群中也提供了對Erlang及.NET等平臺的驅動程式。
  • 檔案儲存格式為BSON(一種JSON的擴充套件)。
  • 可通過網路訪問。

Mongodb適用場景:
  • 網站資料:Mongo非常適合實時的插入,更新與查詢,並具備網站實時資料儲存所需的複製及高度伸縮性。
  • 快取:由於效能很高,Mongo也適合作為資訊基礎設施的快取層。在系統重啟之後,由Mongo搭建的持久化快取層可以避免下層的資料來源 過載。
  • 大尺寸,低價值的資料:使用傳統的關係型資料庫儲存一些資料時可能會比較昂貴,在此之前,很多時候程式設計師往往會選擇傳統的檔案進行儲存。
  • 高伸縮性的場景:Mongo非常適合由數十或數百臺伺服器組成的資料庫。Mongo的路線圖中已經包含對MapReduce引擎的內建支援。
  • 用於物件及JSON資料的儲存:Mongo的BSON資料格式非常適合文件化格式的儲存及查詢。

Mongodb功能:
  • 面向集合的儲存:適合儲存物件及JSON形式的資料。
  • 動態查詢:Mongo支援豐富的查詢表示式。查詢指令使用JSON形式的標記,可輕易查詢文件中內嵌的物件及陣列。
  • 完整的索引支援:包括文件內嵌物件及陣列。Mongo的查詢優化器會分析查詢表示式,並生成一個高效的查詢計劃。
  • 查詢監視:Mongo包含一個監視工具用於分析資料庫操作的效能。
  • 複製及自動故障轉移:Mongo資料庫支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目標是提供冗餘及自動故障轉移。
  • 高效的傳統儲存方式:支援二進位制資料及大型物件(如照片或圖片)
  • 自動分片以支援雲級別的伸縮性:自動分片功能支援水平的資料庫叢集,可動態新增額外的機器。

面試題(sql):經典題