1. 程式人生 > >2017年暑假實習面經: 去哪兒網(一面, 二面, HR面, Offer), 騰訊IEG(一面, GG...), 百度(一面, 二面, 三面, offer)

2017年暑假實習面經: 去哪兒網(一面, 二面, HR面, Offer), 騰訊IEG(一面, GG...), 百度(一面, 二面, 三面, offer)

2017年暑假實習面經: 去哪兒網(一面, 二面, HR面, Offer), 騰訊IEG(一面, GG…), 百度(一面, 二面, 三面, offer)

經過幾個月的努力, 春招應該就這麼結束了。總的來說這次春招結果還是比較理想(去哪兒網 offer + 百度 offer)。有點遺憾是騰訊一面由於我的專案經驗不足, 而把我掛了。面試之前, 在網上看了許多面經, 對我的幫助也很大, 因此, 我也就決定寫點東西, 算是對前人的工作的回報, 也算是為後來者提供經驗。

一. 去哪兒網(2017-4-13)

去哪兒網的面試安排在成都春熙路的亞朵輕居, 酒店的氛圍還是很溫馨的。到了之後, 先讓我們簽到排隊, 等待面試官叫號。

1. 去哪兒網一面

去哪兒網的一面面試官是我遇到的最好的面試官, 沒有之一。因為這是我第一次面試, 過程中出現了許多尷尬的事情, 面試官很親切的讓我別緊張。有的問題我不太瞭解, 他也循序誘導, 讓我最後得出較為滿意的結果。面完之後, 就讓我去等候室等二面。
下面是一面問題的羅列:

(1) STL 相關: STL 中的記憶體管理(allocator)的原理, 以及如何讓它執行緒安全。

  • 因為我對 STL 原始碼比較瞭解, 所以就很輕鬆地回答了 allocator 的實現原理, 相關實現可以參考《STL 原始碼剖析(侯捷)》。

  • 由於對執行緒安全瞭解的比較少, 所以直接我給面試官說我不知道。面試官也沒多說。等到後面回答了執行緒安全的單例模式時, 面試官讓我把那裡執行緒安全的知識用在這裡來。然後我就大概寫了一下分配器工作的關鍵程式碼的虛擬碼, 然後試著去加鎖。最後面試官還是覺得很滿意的。

(2) 作業系統相關: 什麼是程序, 什麼是執行緒。它們之間的區別和聯絡。

  • 我就隨便談了談自己的理解: 程序管理記憶體資源+執行過程, 執行緒只管理執行過程, 執行緒要在程序提供的資源基礎上執行。 Blabla…. 作業系統書上介紹得詳細, 我這裡也就不多說了。

(3) 設計模式相關: 單例模式及其應用

  • 這個網上隨便找一篇介紹單例模式的文章都有詳細地介紹。我就從基本的單例模式到執行緒安全的單例模式, 用智慧指標管理的單例等大概說了說。
  • 關於應用, 我就舉了 《Effective C++》中的一個例子。定義在兩個檔案下的全域性變數A, B,然後A 需要用 B 來初始化, 但是由於不知道 B 是否在 A 初始化時, 已經初始化了。因此我們可以用單例來封裝一下, 從而保證了其 B 在 A 之前初始化。

(4)資料結構相關: 判斷一個連結串列是否有環

  • 這個也是經典問題了。一個快指標, 一個慢指標, 然後相遇就有環, 不相遇就沒環。
  bool hasCircle(ListNode* pHead){
      ListNode* pFaster = pHead;
      ListNode* pSlower = pHead;
      do{
          // 快指標走兩步
          if(pFaster->next != NULL) pFaster = pFaster->next->next;
          // 慢指標走一步
          pSlower = pSlower->next;
      }while(pFaster != NULL && pSlower != NULL && pFaster != pSlower);
      if(pFaster == NULL || pSlower == NULL) return false;
      return true;
  }

2. 去哪兒網二面

去哪兒網二面的面試官明顯比一面面試官年紀大, 估計應該是管理層的。一開場就問了特別難的問題, 表示一臉懵逼。好在後面的問題回答得還算可以, 因此, 面試完之後, 面試官就讓我去等 HR 面。

(1) 在公網的兩臺伺服器, 每個伺服器都有一個標準的時鐘, 已知其中一個伺服器時鐘是準確的, 另外一個伺服器的時鐘快或慢了一些。請設計同步時鐘的演算法。

  • 一臉懵逼… 但是我不說。 = =! 硬起頭皮說了個 “多次測量在傳輸過程中耗費的時間求平均值, 然後讓待校準的伺服器將收到的標準時間加上求得的平均時間”。 然後面試官不滿意, 因為網路這個東西很不穩定, 這個傳輸時間怎麼能這樣算呢。我也很絕望啊! 我也沒辦法啊! 我還以為有巧妙的方法可以算出準確的時間, 一直在想, 結果還是沒想出來。結果面試結束我在網上搜了下, 原來這個要用統計學什麼的知識, 儘可能精確地估計時間。

(2) STL 原始碼中的 hash 表的實現

  • 將資料實際存放在與 hash 表儲存單元相連結的連結串列中,而不是 hash 的儲存單元中。 當產生衝突的時候,將兩個資料都連結在同一 hash 儲存單元儲存的連結串列中。然後當插入元素的個數和表的大小一樣時, 就讓表的大小擴大為比最接近之前大小的兩倍的質數大小。
  • 面試官順著這個就問, 怎麼找質數。我就簡單地說了下篩選法的思路。

3. 去哪兒網三面(HR面)

HR 面就沒什麼好說的了。就是談談人生, 聊聊理想, 說說薪資。然後說我已經過了, 但是 offer 要等 5 月份, 全部人面完了之後一起發。然後 5 月初就收到了確認郵件。總的來說, 去哪兒網的面試還是很輕鬆的, 面試官人也都比較好。

二. 騰訊IEG(2017-4-16)

騰訊是我這次春招的痛點啊。實在是為了騰訊面試準備了太久, 但是想不到一面就沒有過。面試官結束之後說了句 “基礎很紮實, 就是專案經驗不足”。 頓時心都寒了。為了去參加騰訊面試, 還從四川千里迢迢跑到陝西, 沒想到…

1. 騰訊一面(GG…)

(1) 實現一個迴圈佇列。

  • 這個很基礎, 這裡就不多說。

(2) 一個程式從開始執行到結束的完整過程。

  • 大概就是載入頁面之類, blabla…

(3) STL 的 unordered_map 和 map 的區別

  • 一個底層實現是雜湊表, 一個是紅黑樹
  • 由於底層實現的不同, 所以一個是有序, 一個是無序的。
  • 一個查詢搜尋複雜度是 O(1), 一個是O(logN).

(4) … (記不住了…, 對於不收我的公司, 連面試題目我也記不住。 呵呵…)

三. 百度(2017-5-6)

參加百度校招的經歷算是一波三四五…折了。先是由於自己在百度校招官網申請了實習生, 學長的內推就沒成功。然後由於騰訊一面就掛了, 沒什麼心情參加百度筆試, 差點兒就沒參加了。 筆試通過後又通知我去北京現場面試,然而我根本沒時間。發郵件給 HR 改為視訊面試, HR 說改了之後可能會失去機會。沒辦法, 只好改了。還好, 當天晚上就給我發了視訊面試的邀請。
總的來說, 百度更重視基礎, 不太重視專案經驗。 幾乎全程都在問 C++ 和 資料結構之類的問題。

1. 百度一面

由於網路原因, HR 一面面試官幾乎就沒有用牛客網的平臺, 直接打電話給我手機 —— 視訊面試變成了電話面試。 = =!

(1) 寫一個 memcpy() 函式

  • 由於之前瀏覽過原始碼, 大概記得起實現, 很快就完成了。
  void *memcpy(void *dst, const void *src, size_t len)  
  {  
  if(NULL == dst || NULL == src){  
    return NULL;  
  }  

  void *ret = dst;  

  if(dst <= src || (char *)dst >= (char *)src + len){  
    while(len--){  
    *(char *)dst = *(char *)src;  
    dst = (char *)dst + 1;  
    src = (char *)src + 1;  
    }  
  }else{  
    src = (char *)src + len - 1;  
    dst = (char *)dst + len - 1;  
    while(len--){  
      *(char *)dst = *(char *)src;  
      dst = (char *)dst - 1;  
      src = (char *)src - 1;  
      }  
    }  
    return ret;  
  }  

(2) 寫一個快排
* 這也是老生常談的問題了。

  //[beg, end)
  void QuickSort(vector<int>& datas, int beg, int end){
    if(beg+1 >= end) return;
    int i = beg, j = end - 1;

    while(i < j){
      while(i < j && datas[i] <= datas[beg]) ++i;
      while(i < j && datas[j] > datas[beg]) --j;
      if(i < j) swap(datas[i], datas[j]);
      ++i, --j;
      }
    swap(datas[beg], datas[j]);

    QuickSort(datas, beg, j);
    QuickSort(datas, j+1, end);
  }

(3) 程序和執行緒的區別

  • 和前面去哪兒網的面試回答類似。

(4) 介紹一下 STL 原始碼的內容。

  • 隨便說了說。

(5) vector 的實現

  • 先申請一定的大小的陣列, 當陣列填滿之後,另外申請一塊原陣列兩倍大的新陣列, 然後把原陣列的資料拷貝到新陣列, 最後釋放原陣列的大小。 詳情參考 《STL原始碼剖析(侯捷)》。

(6) C++ 與 C 的區別。

  • C++ 包含 C 幾乎全部功能。
  • C++ 比 C 多面向物件語言部分。
  • C++ 比 C 多泛型程式設計部分。
  • C++ 比 C 多 STL 部分。
  • 詳情參考 《Effective C++》。

2. 百度二面

(1) 單例模式

  • 和前面去哪兒網的回答類似。

(2) 在C++中的 const 和 static 用法。
這個比較多, 詳細的可以自己在網上找找。

  • const 關鍵字: 用在區域性變數上, 用在類成員變數上, 用在類成員函式後面…
  • static 關鍵字: 用在全域性變數上, 用在區域性變數上,用在類成員變數上, 用在類成員函式上…

(3) 計算下面幾個類的大小

  • class A {}; : sizeof(A) = 1;
  • class A { virtual Fun(){} }; : sizeof(A) = 4(32位機器)/8(64位機器);
  • class A { static int a; }; : sizeof(A) = 1;
  • class A { int a; }; : sizeof(A) = 4;
  • class A { static int a; int b; }; : sizeof(A) = 4;

(4) 已知某類:

   class A 
   {
   public:
     A(int x){}
   }

問: A a = 1; 是否正確, 如果正確, 那麼它呼叫了哪些函式?

  • 由於 A 類的建構函式沒有宣告為 explicit 因此可以 int 型別強制轉換來。因此, 該表示式正確。
  • 對於沒有優化過的編譯器: 先將 1 轉化為 A 型別(建構函式), 再將其賦值給 a 變數(拷貝賦值函式)。
  • 對於優化了的編譯器: 直接用 1 來構造變數 a(建構函式)。

(5) 程式碼找錯:

   char* str = "hello";                 1)
   char* p = new char[5];               2)
   strcpy(p, str);                      3)
   cout << p << endl;                   4)
  • 編譯通過, 執行時出錯。
  • 2) 中的陣列申請太小, 無法容納下 “hello” 的大小。 因為字串後面還有結束符(‘\0’)。
  • 與 new 搭配的是 delete。2) 中 new 了資源沒有 delete 掉。

(6) class {} 內部實現的函式。

  • 一般認為: 預設建構函式, 預設解構函式, 拷貝賦值函式, (移動建構函式, 移動賦值函式)
  • 《深度探索C++物件模型》中講到, 不一定會生成這些函式, 然後blabla…(太多了, 這裡不細說)

(7) C++ 語言的特性

  • 表示一臉懵逼, 但是還是硬起頭去回答。下面羅列出我的回答, 不知道正確與否。
  • C++ 是面向物件的語言, 自然有面向物件的語言的特性: 封裝, 繼承, 多型。
  • C++ 也是泛型程式語言, 自然也有泛型程式語言的特性。

(8) C++ 語言的虛擬函式相關

  • 含有虛擬函式的物件內部儲存有一個虛擬函式指標(vptr), 指向一個虛擬函式表(vtbl), 表內是函式指標。blabla…(詳情參看 《深度探索C++物件模型)

(9) 過載和重寫的區別

  • 過載要求相同的函式名, 不同的引數列表。僅返回值不同的函式不能過載。
  • 重寫要求父類是虛擬函式, 子類改寫其函式體。要求函式簽名一模一樣。

3. 百度三面

百度三面比較隨意。面試官也就隨便問問程式碼, 聊聊人生。

(1)翻轉一個連結串列

  • 我首先用一個棧來實現。
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        stack<ListNode*> stk;
        stk.push(nullptr);
        while(pHead != nullptr){
            stk.push(pHead);
            pHead = pHead->next;
        }
        ListNode* tmp = nullptr;
        while(stk.empty() == false){
            if(tmp == nullptr){
                pHead = tmp = stk.top();
            }else{
                tmp->next = stk.top();
                tmp = tmp->next;
            }
            stk.pop();
        }

        return pHead;
    }
};
  • 面試官不滿意, 讓我優化, 然後就用了下面的方法。遍歷一遍用頭插法。
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
       ListNode* newHead = nullptr;
       while(pHead != nullptr){
           ListNode* tmp = pHead->next;
           pHead->next = newHead;
           newHead = pHead;
           pHead = tmp;
       }
       return newHead;
    }
};

(2) 氣泡排序

void bubble_sort(int datas[], int n)  
{  
    if (NULL == datas || 0 == n)
    {
        return;
    }

    for (int i = 0; i < n; ++i)  
    {  
        for (int j = 0; j < n - i; ++j)  
        {  
            if (datas[j] > datas[j + 1]) 
            {
                swap(datas[j], datas[j + 1]);
             }
        }   
    }  
}  

(3) 為什麼選擇百度

  • 額… 這個… blabla…

3. 百度 HR 通知

5月6日面試, 5月17日收到 HR 的通知。確認資訊, 問我是否有其他 offer, 選擇入職時間, 實習時間。blabla…

四. 總結

總的來說, 這次春招的結果還算滿意。中間可能也對自己的實力感到懷疑, 但是幸好自己沒有放棄!

相關推薦

2017暑假實習: 哪兒(一面, , HR, Offer), IEG(一面, GG...), (一面, , , offer)

2017年暑假實習面經: 去哪兒網(一面, 二面, HR面, Offer), 騰訊IEG(一面, GG…), 百度(一面, 二面, 三面, offer) 經過幾個月的努力, 春招應該就這麼結束了。總的來說這次春招結果還是比較理想(去哪兒網 offer + 百度

2017暑期實習程式設計題之趕公司

趕去公司 題目描述: 終於到週末啦!小易走在市區的街道上準備找朋友聚會,突然伺服器發來警報,小易需要立即回公司修復這個緊急bug。假設市區是一個無限大的區域,每條街道假設座標是(X,Y),小易當前在(0,0)街道,辦公室在(gx,gy)街道上。小易周圍有多個計程車打車點,小易趕去辦公室有兩種選擇

[哪兒]首個重復字符

ron wrap question pub item class clas tag n) 時間限制:3秒 空間限制:32768K 熱度指數:33999 本題知識點: 查找 題目描述 對於一個字符串,請設計一個高效算法,找到第一次重復出現的字符。 給定一個字符串(不一定

哪兒怎麽淪為騙子的平臺了,一步步揭開哪兒欺騙消費者的把戲

客服 讓我 支付 技術 發現 都江堰 去哪兒網 接機 stat 先讓我大哭一會兒 現在的去哪兒網真是牛擺哄哄,明目張膽誆騙老用戶啊。 好傷心。好難過,被騙了,被坑了。 之前一直在去哪兒訂機票,還沒發現有什麽不正確的地方 知道今天。我才悔恨不已啊, 此事還得從頭

201711月11日軟考絡規劃設計師案例分析真題及答案解析

2017軟考網工真題 2017軟考網工答案 軟考網工真題 軟考網工答案 網工真題答案 【徐朋出品,必屬精品】軟考徐朋老師全網最先發布2017年11月11日軟考網絡規劃設計師案例分析真題及答案解析,是全網最清新版本。詳細講解了2017年11月11日最新開考的軟考網絡規劃設計師案例分析真題及答

201711月11日軟考絡工程師案例分析真題及答案解析

軟考網工真題 2017軟考網工答案 2017軟考網工真題 軟考網工真題答案 【徐朋出品,必屬精品】軟考徐朋老師全網最先發布2017年11月11日軟考網絡工程師案例分析真題及答案解析,是全網最清新版本。詳細講解了2017年11月11日最新開考的軟考網絡工程師案例分析真題及答案。課件中對每一道真題

2017西南民族大學程序設計競賽-絡同步賽(代碼)

true can 而且 pri 排名 scan namespace and define 20598954 nmphy D 答案正確 8 512 486 C++ 2017-12-30 14:30:35 205987

普通高中課程方案和語文等學科課程標準(2017版)----分析及教育部官網址

信息 智能家居 eight ffffff 機器 add href 分享圖片 能源 我主要關註:高中信息技術、通用技術方面的課標。下面就把我的體會總結一下,便於後續教研。 高中信息技術 高中通用技術

哪兒玩樂事業部-數據模式演進

2015年 理解 自動化 表達 平臺 裏的 sync 有助於 系統搭建 簡介 一轉眼在去哪兒網玩樂事業部工作快4年了,經歷了數據團隊的組建和發展,回顧一下整體過程,經歷了很多坎坷,普通而不簡單。下面是大事記 2014年(系統搭建):開發報表平臺、接入HADOOP、搭

Vue2.5開發哪兒App 從零基礎入門到實戰項目

eset 通過 計算 拆分 lan 修復 周末 模塊 blank 第1章 課程介紹本章主要介紹課程的知識大綱,學習前提,講授方式及預期收獲。第2章 Vue 起步本章將快速講解部分 Vue 基礎語法,通過 TodoList 功能的編寫,在熟悉基礎語法的基礎上,擴展解析 MVV

Vue2.5開發哪兒App 從零基礎入門到實戰項目

基礎配置 可能 lan 第2章 方式 路由 表單 加載 基礎入門 第1章 課程介紹本章主要介紹課程的知識大綱,學習前提,講授方式及預期收獲。1-1 課程簡介 第2章 Vue 起步本章將快速講解部分 Vue 基礎語法,通過 TodoList 功能的編寫,在熟悉基礎語法的基礎上

Alluxio 幫助哪兒酒店數據業務最高提速300x

進行 hive 酒店業 shanghai mapred jpg 利用 http 兼容 Alluxio是分布式的數據緩存層,獨立的服務,API兼容HDFS,充分利用單機的文件緩存和層次化的數據存儲方式,讓上層分布式應用業務訪問數據可以充分享受高效緩存所帶來的性能提升。去哪兒酒

2018校招-深信服-申-技術服務工程師掛麵

招聘要求 筆試 試題只有40個選擇,2個簡答,相對於其他公司而言,筆試是相當簡單的。我以為面試也會特別簡單,你以為只是你以為。 筆試簡答題目記得一個:身份認證三種技術 在真實世界,對使用者的身份認證基本方法可以分為這三種: (1)基於資訊祕密的身份認證 根據你所知道

哪兒2014筆試演算法題彙總

1.寫一個函式,轉換相對路徑為絕對路徑,比如:/home/abs/../temp/new/../,輸出路徑為:/home/temp。 參考程式碼: //寫一個函式,轉換相對路徑為絕對路徑,比如:/home/abs/../temp/new/../,輸出路徑為:/home/

相容MySQL的開源分散式資料庫SequoiaDB在哪兒的實踐

在開源資料庫大會(ODF)在京舉辦成功落幕之際,也許很多人依然沉浸在技術大餐中,因為這些技術正是每個從業者所關注甚至是自己的飯碗。只有這樣的技術會議,才會引起技術的碰撞以及共鳴。正如會議很大的一個亮點,“MariaDB/MySQL vs PostgreSQL世紀大決戰”,現場火藥味十足。本人

前端-Vuejs2.5開發哪兒

Vuejs開發去哪兒網 重要說明 -_-|| 專案開始日期 2018-07-22,結束日期 2018-07-28 更換開發環境時,記得先npm install一下,再啟動(可能需要安裝新的依賴) 更換開發環境時,切換分支後,記得git pull(只pul

Vue2.5開發哪兒App 從零基礎入門到實戰專案最新無密

  第1章 課程介紹本章主要介紹課程的知識大綱,學習前提,講授方式及預期收穫。1-1 課程簡介第2章 Vue 起步本章將快速講解部分 Vue 基礎語法,通過 TodoList 功能的編寫,在熟悉基礎語法的基礎上,擴充套件解析 MVVM 模式及前端元件化的概念及優勢。2-1 課程學

記錄一次哪兒筆試題(2018/09/06)

輸入三個數 分別是 年份 月份  以及按星期幾開始排列(星期日是0 其他依次為1 2 3 4 5 6) 輸出兩個數 第一個表示該年月分  第一天在排列中是第幾列         

Alluxio 幫助哪兒酒店資料業務最高提速300x

Alluxio是分散式的資料快取層,獨立的服務,API相容HDFS,充分利用單機的檔案快取和層次化的資料儲存方式,讓上層分散式應用業務訪問資料可以充分享受高效快取所帶來的效能提升。去哪兒酒店業務中,混合了大資料實時處理業務型別,也有批量資料處理業務,還有既有Hive(MapReduce)作業

Vue.js學習記錄-14-Vue哪兒專案實戰:城市列表頁開發-Alphabet + 細節配置補充

Alphabet:字母表導航條 (增量式) 元件data初始化: name: 'CityAlphabet', props: { cities: Object }, data() { return { touchStatus: fal