本檔案收錄了春招及秋招(含提前批)中能回憶起來的面試題,
- 部分公司我既參加了春招也參加了秋招,將題目整合在了一起;
- 所列題目不全,僅僅列出了我能回憶起來的部分題目;
- 所列解答僅供參考
一、騰訊(春招 / 后臺開發)
二、阿里巴巴(秋招 / 阿里云-邊緣計算)
三、百度(秋招 / C++開發)
四、位元組跳動(提前批 / 客戶端開發)
五、深信服(提前批 / C++開發(物聯網方向))
六、大疆(秋招 / 通信演算法工程師)
七、京東(秋招 / 京東云-C++開發)
八、華為(秋招 / 通用軟體開發)
九、VIVO(秋招 / 嵌入式開發)
十、OPPO(秋招 / 通信協議工程師)
十一、TP_LINK(秋招 / 應用軟體開發工程師)
十二、中興(秋招 / 崗位1 軟體開發)
十三、中興(秋招 / 崗位2 通信講師)
十四、二十八所(秋招 / C++開發)
十五、CVTE(提前批 / C++開發)
十六、海康威視(秋招 / C++軟體開發)
十七、烽火通信(秋招 / 軟開)
十八、小米(秋招 / 系統開發工程師)
十九、七二二所
二十、七〇九所.
二十一、浦發銀行(秋招 / 資訊科技崗)
二十二、網易互娛(秋招 / 初級游戲開發)
一、 騰訊(春招 / 后臺開發)
1、 Linux查看共享記憶體的方式,
使用 ipcs 命令,不加任何引數時,會把共享記憶體、信號量、訊息佇列的資訊都列印出來,如果只想顯示共享記憶體資訊,使用如下命令:
ipcs -m
2、 打開一個網頁,需要用到多少協議?
3、 查看系統I/O負載
查看CPU、記憶體的命令:top
Linux 中的 ps 命令是 Process Status 的縮寫,ps 命令用來列出系統中當前運行的那些行程,ps 命令列出的是當前那些行程的快照,就是執行 ps 命令的那個時刻的那些行程,如果想要動態的顯示行程資訊,就可以使用 top 命令,
ps aux 和 ps -ef 兩者的輸出結果差別不大,但展示風格不同,aux是 BSD 風格,-ef 是 System V 風格,這是次要的區別,一個影響使用的區別是aux會截斷command列,而 -ef 不會,當結合 grep 時這種區別會影響到結果,
4、 Linux 下查看行程打開的檔案句柄數
查看系統默認的最大檔案句柄數,系統默認是1024
具體查看方法:
- 通過 ps -ef |grep +行程名查看行程是否存在
- 根據查看到 SSH 的行程 ID(1792),進入行程所在目錄 cd/ proc/+行程名
- 查看此目錄,可看到行程對應執行緒目錄 task 和檔案句柄數目錄 fd
- 進入 fd 目錄,查看行程打開的檔案句柄的詳細資訊
- 通過 ls | wc -l 統計行程打開的句柄數 ( Linux 系統中的 wc(Word Count) 命令的功能為統計指定檔案中的位元組數、字數、行數,并將統計結果顯示輸出,c 統計位元組數,l 統計行數,)
- 進入 task 目錄,查看行程的執行緒的詳細資訊,查看執行緒數同樣可以采用 ls | wc -l
5、 查看檔案的詳細資訊
ls -l (ll)
file +filename
stat +filename
6、 跑道問題
36個人,6個跑道,怎么篩選出前三名?
1)6個人一組,得到每個組里第一名,共6輪
2)取出每組第一名,跑一次,得到前三名,并拋棄其他三個組的人;共1輪
3)這樣,第一名所在的組有三個候選者,第二名所在的組有兩個候選者,第三名所在的組就只有自己一個候選者,
這些人一起跑,一次,即可選出前三名,
其實第一名在2)中已經確定,
那么,問題拓展就是,6個跑道,跑8輪最可以從多少人中篩選出前三?--37人,
7、 上N級臺階問題
https://blog.csdn.net/StepByStepTo/article/details/82695341
int climbStairs(int n)
{
if( n <= 2)
{
return n;
}
else
{
return climbStairs(n-1)+climbStairs(n-2);
}
}
int climbStairs(int n)
{
int i =0;
int ret =0 ;
int * arr = (int *)malloc((n+1)*sizeof(int));
for ( i=0; i<=n; i++)
{
if(i <3)
{
arr[i]=i;
}
else
{
arr[i]=arr[i-1]+arr[i-2];
}
}
ret = arr[n];
free(arr);
arr=NULL;
return ret;
}
int climbStairs(int n)
{
int arr[3]={0,1,2};
if (n < 3)
{
return n;
}
for (int i=3; i<=n; i++)
{
arr[i%3]=arr[(i-1)%3]+arr[(i-2)%3];
}
return arr[n%3];
}
8、 在字串中查找不重復的字母
方法一:
下標快取法:
將一個陣列初始化為0,當出現這個下標對應的字母時,則該下標對應的數字加一,結束后,統計陣列中為1的下標,即為不重復的字母
方法二:
使用set
遍歷插入set,當插入的時候回傳false,就表明這個元素是重復的,那么就通過遍歷查找,洗掉所有的這個元素,以此類推,得到剩下的元素就是不重復的
注意全部查找的方法:
while ((pos = src.find(s[i], pos)) != string::npos){std::cout << "pos = " << pos << std::endl;src.erase(pos, 1);pos++;}
9、 兩個單鏈表是否相交
對于單鏈表問題,優先考慮將單鏈表變成回圈鏈表
10、 扔玻璃球看在哪層樓會摔碎
既然第一步(確定臨界段)的投擲數增加不可避免,我們就讓第二步(確定臨界層)的投擲數隨著第一步的次數增加而減少,第一步的投擲數是一次一次增加的,那就讓第二步的投擲數一次一次減少,假設第一次投擲的層數是f,轉化成數學模型,就是要求f+(f-1)+...+2+1>=99,即f(f+1)/2>=99(第一次測驗點選擇100層是無意義的,必然會碎,所以無任何測驗價值,所以第一次測驗點k是1-99中的一個數),解出結果等于14,丟下第一顆雞蛋的樓層就分別是 14 , 27 , 39 , 50 , 60 , 69 , 77 ,84 , 90 , 95 , 99 ,
找到
int MaxSubSum(int arr[],int len)
{
int i;
int MaxSum = 0;
int ThisSum = 0;
for( i = 0;i < len; i++)
{
ThisSum += arr[i];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
/*如果累加和出現小于0的情況,
則和最大的子序列肯定不可能包含前面的元素,
這時將累加和置0,從下個元素重新開始累加 */
else if(ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
二、 阿里巴巴(秋招 / 阿里云-邊緣計算)
1、 5G知識
2、 MEC知識
3、 Vlan標簽怎么打
4、 執行緒間通信方式
鎖機制:包括互斥鎖、條件變數、讀寫鎖
互斥鎖提供了以排他方式防止資料結構被并發修改的方法,
讀寫鎖允許多個執行緒同時讀共享資料,而對寫操作是互斥的,
條件變數可以以原子的方式阻塞行程,直到某個特定條件為真為止,對條件的測驗是在互斥鎖的保護下進行的,條件變數始終與互斥鎖一起使用,
信號量機制(Semaphore):包括無名執行緒信號量和命名執行緒信號量
信號機制(Signal):類似行程間的信號處理
執行緒間的通信目的主要是用于執行緒同步,所以執行緒沒有像行程通信中的用于資料交換的通信機制,
5、 系統中斷信號處理函式能不能被修改,其中如果有sleep函式會怎樣?
三、 百度(秋招 / C++開發)
1、 Vector申請記憶體的方式
vector<int>().swap(myvector);
reserve 是容器預留空間,但并不真正創建元素物件,在創建物件之前,不能參考容器內的元素,因此當加入新的元素時,需要用 push_back()/insert() 函式,
2、 多執行緒實作廣度優先遍歷
3、 長連接短連接
HTTP 的長連接和短連接本質上是 TCP 長連接和短連接
HTTP 協議是無狀態的,指的是協議對于事務處理沒有記憶能力,服務器不知道客戶端是什么狀態,也就是說,打開一個服務器上的網頁和上一次打開這個服務器上的網頁之間沒有任何聯系,HTTP 是一個無狀態的面向連接的協議,無狀態不代表 HTTP 不能保持 TCP 連接,更不能代表 HTTP 使用的是 UDP 協議(無連接),
在 HTTP/1.0 中默認使用短連接,也就是說,客戶端和服務器每進行一次 HTTP 操作,就建立一次連接,任務結束就中斷連接,當客戶端瀏覽器訪問的某個HTML或其他型別的 Web 頁中包含有其他的 Web 資源(如 JavaScript 檔案、影像檔案、CSS 檔案等),每遇到這樣一個 Web 資源,瀏覽器就會重新建立一個 HTTP 會話,
而從 HTTP/1.1起,默認使用長連接,用以保持連接特性,使用長連接的HTTP協議,會在回應頭加入這行代碼:
Connection:keep-alive
在使用長連接的情況下,當一個網頁打開完成后,客戶端和服務器之間用于傳輸 HTTP 資料的 TCP 連接不會關閉,客戶端再次訪問這個服務器時,會繼續使用這一條已經建立的連接,Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟體(如 Apache)中設定這個時間,實作長連接需要客戶端和服務端都支持長連接,
HTTP 協議的長連接和短連接,實質上是 TCP協議的長連接和短連接,
4、 平衡二叉樹及深度優先遍歷和廣度優先遍歷
二叉排序樹(Binary Sort Tree)又稱二叉查找樹,它或者是一棵空樹;或者是具有下列性質的二叉樹:(1)若左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;(2)若右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;(3)左、右子樹也分別為二叉排序樹
平衡二叉樹定義(AVL,Adelson-Velskii and Landis):它或者是一顆空樹,或者具有以下性質的二叉樹:它的左子樹和右子樹的深度之差(平衡因子)的絕對值不超過1,且它的左子樹和右子樹都是一顆平衡二叉樹,
(AVL)平衡二叉樹是一種二叉排序樹,其中每個結點的左子樹和右子樹的高度差至多等于1,它是一種高度平衡的二叉排序樹,意思是說,要么它是一棵空樹,要么它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過1,
平衡二叉樹是一種二叉排序樹,也就是二叉排序樹包含了平衡二叉排序樹,其次它要滿足后面的約束條件,就是每個結點的左子樹和右子樹的高度差不超過1
5、 手寫代碼:在一個陣列中找出所有m個和為n的子陣列,
6、 TCP/UDP各自的應用場景,
7、 手寫代碼:實作strcpy函式,
四、 位元組跳動(提前批 / 客戶端開發)
1、 http和https的區別是什么?
2、 手寫代碼:給定一系列區間,要求整合重疊區間,輸出最終的區間情況,
五、 深信服(提前批 / C++開發(物聯網方向))
1、 怎么解決記憶體泄漏問題?
- valgrind
- 利用pmap+gdb,pmap可以列出特定行程的所有記憶體分配的地址和大小,通過gdb就可以直接看這些地址屬于什么變數,通過統計這些記憶體地址的大小,就可以很容易的發現問題,利用自動化的gdb除錯工具也可以很方便的定位,
- 利用一些trace工具,比如ptrace,strace之類的工具,這些trace工具會追蹤特定的api,只需要統計malloc和free的呼叫次數就可以簡單的發現是否有泄漏,但是無法定位代碼行,
2、 new 和malloc在申請記憶體失敗后會怎樣
try{int *p = new int[10];}catch(std::bad_alloc){}
3、 防御性編程
- 通過采用良好的編程風格,來防范大多數編碼錯誤
- 編碼的目標是清晰,不只是簡潔
- 檢查所有的回傳值
- 使用安全的資料結構
- 在宣告的位置上初始化所有的變數
- 盡可能推遲一些宣告變數
- 謹慎地進行強制轉換
- assert斷言
4、 陣列和鏈表的區別
不同:鏈表是鏈式的存盤結構;陣列是順序的存盤結構,
鏈表通過指標來連接元素與元素,陣列則是把所有元素按次序依次存盤,
鏈表的插入洗掉元素相對陣列較為簡單,不需要移動元素,且較為容易實作長度擴充,但是尋找某個元素較為困難;
陣列尋找某個元素較為簡單,但插入與洗掉比較復雜,由于最大長度需要再編程一開始時指定,故當達到最大長度時,擴充長度不如鏈表方便,
相同:兩種結構均可實作資料的順序存盤,構造出來的模型呈線性結構,
5、 覆寫隱藏和多載
多載是指同名函式具有不同的引數表,
覆寫是指派生類中存在重新定義基類的函式,其函式名、引數列、回傳值型別必須同父類中相應被覆寫的函式嚴格一致,覆寫函式和被覆寫函式只有函式體不同,當基類指標指向派生類物件,呼叫該同名函式時會自動呼叫子類中的覆寫版本,而不是父類中的被覆寫函式版本,
隱藏是指派生類的函式屏蔽了與其同名的基類函式,
如果派生類的函式與基類的函式同名,但引數不同,則無論有無virtual關鍵字,基類的函式都被隱藏,
如果派生類的函式與基類的函式同名,并且引數也相同,但是基類函式沒有virtual關鍵字,此時基類的函式被隱藏,
6、 C++ 中使用 C 編譯應該怎么呼叫
extern “C”{void foo(int x, int y); // 其它函式}
或者寫成
extern “C”{#include “myheader.h” // 其它C 頭檔案}
這就告訴 C++ 編譯譯器,函式 foo 是個 C 連接,應該到庫中找名字 _foo 而不是找 _foo_int_int,
C++ 編譯器開發商已經對 C 標準庫的頭檔案作了 extern“C” 處理,所以我們可以用 #include 直接參考這些頭檔案,
7、 gdb 除錯的方法:如何在問題現場查問題
- gdb 加入除錯資訊:-g
- bt backtrace: 顯示程式堆疊信息
8、 如何尋找最小的前十個數/找到無序陣列中第k大的元素
- 【方法1】
維護一個大小為k的最小堆,遍歷陣列,如果陣列元素比堆頂元素大,則用該元素替換堆頂元素,時間復雜度為O(nlogk).
- 【方法2】
用快速排序中分治的思想
取基準元素,將無序陣列分為前后兩段,前段所有元素的值小于等于基準,后段所有元素的值大于等于基準,記后段的長度為blen, 每次切分時,每次分治時,分3種情況討論:
blen = k-1: 此時說明有k-1個數大于等于基準,基準就是第k大大數,直接回傳基準
blen < k-1:此時說明第k大的數在前段,在前段中查找第(k-blen-1)大的數
blen > k-1:說明此時第k大的數在后段,在后段中查找第k大的數
此外還要注意類快排的分治法性能不穩定,分治的均勻性會影響演算法的時間復雜度,分治越不均勻,演算法效率越低,因此,當k=1或k=n時不要分治了,直接O(n)遍歷陣列求最大/最小值即可,這個優化可以大大提高效率,而最小堆解法性能穩定,不需要對k=1和k=n進行特殊處理,
9、 尋找兩個字串的最長公共子字串
1) 窮舉法
給定兩個字串 A 和 B,我們可以通過從 A 的第一個字符開始與 B 對應的每一個字符進行對比的方式找到最長的公共字串,如果此時沒有找到匹的字母,則移動到 A 的第二個字符處,然后從 B 的第一個字符處進行對比,以此類推,
2) 動態規劃-空間換時間
采用一個二維矩陣來記錄中間結果,矩陣的橫坐標為字串1的各個字符,矩陣的縱坐標為字串2的各個字符,
10、 malloc 最大能分配多大的記憶體,512M 的記憶體能夠分配出這么多的空間嗎
11、 簡介二叉樹,平衡二叉樹存在的意義
12、 使用堆排序和使用快速排序有什么不同
13、 哈希表
14、 strcpy 的缺點
①:它是char *型別,它回傳的是第一個引數的值,即一個字符的地址,
②:第一個引數不需要指向陣列的開始,
如果想把一個字串的一部分復制到另一個字串的某個位置,該怎么辦呢,顯然strcpy()函式是滿足不了這個功能的,strncpy()函式是為了彌補strcpy()函式不能檢查目標字串是否容納下源字串的不足而設定的一個函式,并且完全可以實作這個功能,
strcpy_s(szBuf, 2, "12131"); //新的CRT函式
strcpy(szBuf, "12131"); //老的CRT函式
上述代碼,明顯有緩沖區溢位的問題,使用strcpy_s函式則會拋出一個例外,而使用strcpy函式的結果則未定,因為它錯誤地改變了程式中其他部分的記憶體的資料,可能不會拋出例外但導致程式資料錯誤,也可能由于非法記憶體訪問拋出例外,
使用新的增強安全的CRT函式有什么好處呢?簡單地說,新的函式加強了對引數合法性的檢查以及緩沖區邊界的檢查,如果發現錯誤,會回傳errno或拋出例外,老版本的這些CRT函式則沒有那么嚴格的檢查與校驗,如果錯誤地傳輸了引數或者緩沖區溢位,那么錯誤并不能被立刻發現,對于定位程式錯誤也帶來更大困難,
六、 大疆(秋招 / 通信演算法工程師)
1、 現在有一個無人機在飛,你手上有個遙控器,如果保障遙控器和無人機之間的可靠傳輸?
2、 WIFI頻段和雷達頻段之間的資源共享如何實作?
七、 京東(秋招 / 京東云-C++開發)
1、 手寫代碼:字串單詞逆序:“I like Beijing.”轉成“Beijing. like I”
2、 32位作業系統和64位作業系統的本質區別,
3、 在完成三次握手后,如果網線被剪斷,會發生什么?
4、 虛擬記憶體存在的必要性有哪些?
5、 行程間如何進行通信?
八、 華為(秋招 / 通用軟體開發)
1、 手寫代碼:傳入一個矩陣(n * n),將其翻轉90°
2、 如何避免手機在wifi連接下切換AP帶來的卡頓延遲問題?
九、 VIVO(秋招 / 嵌入式開發)
1、 int p[5] 和int(p)[5]的區別
2、 int arr[] = {1,2,3,4,5,6,7,8}
求*(&arr[1] + 7);
3、 簡述大端問題小端問題
十、 OPPO(秋招 / 通信協議工程師)
4、 畫出BACK的幀結構
5、 畫出掃描-認證-關聯的幀互動情況
6、 隱藏終端問題及其解決方法
7、 三種型別幀分別進行介紹
8、 幀聚合技術
9、 歷數各代wifi協議的發展,要求細節到技術提升情況
10、 MIMO中使用的幀
十一、 TP_LINK(秋招 / 應用軟體開發工程師)
1、 手寫代碼:找出兩個單鏈表的第一個公共節點(要求使用至少兩個方法)
2、 手寫代碼:一個只有數字0和1組成的陣列,最大能有k個0替換成1的機會,請問該陣列最長的全為1的子陣列為多長?(詢問演算法復雜度及其優化方案)
3、 演算法題:若干個非均勻的繩子,點燃后每根繩子可以燃燒1個小時,請設計演算法,用最少的繩子找到15分鐘的計時,
十二、 中興(秋招 / 崗位1 軟體開發)
1、 MIMO技術具體細節
2、 OFDMA技術具體細節
3、 5G的主流技術簡介
4、 信道編碼和信源編碼的區別
5、 常見的信道編碼方案
十三、 中興(秋招 / 崗位2 通信講師)
1、 試講一下你所做的專案,
2、 給你三分鐘時間,組織語言用英文表達你從進來到現在的所見所感,(然后面試官會用英語提問,要你回答),
3、 講一講你最大的缺點
4、 講一講你是如何精進自己的授課能力的,
十四、 二十八所(秋招 / C++開發)
1、 演算法題:有一個很大的資料存盤在某個資料結構中,程式需要多次進行訪問,要求每次的訪問都是遍歷,同時遍歷的順序每次都是隨機的,請你設計方案,進行實作,
2、 智力題:為什么人在看鏡子的時候是左右對稱,而不是上下對稱?
3、 如何消除多徑干擾帶來的影響?
4、 MIMO技術除了運用在wifi領域,還運用在哪些領域?
5、 vector的記憶體分配方式是什么?如何修改分配方式?
6、 哈希表簡介
7、 信道編碼都有哪些?
8、 星座圖和眼圖分別是用來干什么的?
9、 堆和堆疊有什么區別?
10、 常用的數字調制方式都有哪些?抗干擾性能最高的是哪個?為什么是這個?
11、 ISO七層模型詳細描述,問各層的加密演算法,
十五、 CVTE(提前批 / C++開發)
1、 malloc 和new的區別
(1)malloc與free是c++/c語言的標準函式,new/delete是C++的運算子,
(2)他們都可用于申請動態記憶體和釋放記憶體,new/delete底層也是執行的malloc/free,new和delete在物件創建的時候自動執行建構式,物件消亡之前會自動執行解構式,
(3)new回傳指定型別的指標,并且可以自動計算出所需要的大小,malloc必須用戶指定大小,并且默然回傳型別為void*,必須強行轉換為實際型別的指標,
malloc實質:malloc函式的實質體現在,它有一個將可用的記憶體塊連接為一個長長的串列的所謂空閑鏈表,呼叫malloc函式時,它沿連接表尋找一個大到足以滿足用戶請求所需要的記憶體塊,然后,將該記憶體塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的位元組),接下來,將分配給用戶的那塊記憶體傳給用戶,并將剩下的那塊(如果有的話)回傳到連接表上,呼叫free函式時,它將用戶釋放的記憶體塊連接到空閑鏈上,到最后,空閑鏈會被切成很多的小記憶體片段,如果這時用戶申請一個大的記憶體片段,那么空閑鏈上可能沒有可以滿足用戶要求的片段了,于是,malloc函式請求延時,并開始在空閑鏈上翻箱倒柜地檢查各記憶體片段,對它們進行整理,將相鄰的小空閑塊合并成較大的記憶體塊,如果無法獲得符合要求的記憶體塊,malloc函式會回傳NULL指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行回傳值的判斷,
2、 陣列越界問題/記憶體泄漏問題
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以后的存取中,在堆疊上的陣列比指標所指向的字串(例如堆)快,
在計算機科學中,記憶體泄漏(memory leak)指由于疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況,記憶體泄漏并非指記憶體在物理上的消失,而是應用程式分配某段記憶體后,由于設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費,記憶體泄漏與許多其他問題有著相似的癥狀,并且通常情況下只能由那些可以獲得程式源代碼的程式員才可以分析出來,然而,有不少人習慣于把任何不需要的記憶體使用的增加描述為記憶體泄漏,嚴格意義上來說這是不準確的,
一般我們常說的記憶體泄漏是指堆記憶體的泄漏,堆記憶體是指程式從堆中分配的,大小任意的(記憶體塊的大小可以在程式運行期決定),使用完后必須顯式釋放的記憶體,應用程式一般使用malloc,calloc,realloc,new等函式從堆中分配到一塊記憶體,使用完后,程式必須負責相應的呼叫free或delete釋放該記憶體塊,否則,這塊記憶體就不能被再次使用,我們就說這塊記憶體泄漏了,
記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,于是產生溢位,
比方說堆疊,堆疊滿時再做進堆疊必定產生空間溢位,叫上溢,堆疊空時再做退堆疊也產生空間溢位,稱為下溢,
3、 vector的實作方法
新增元素:vector通過一個連續的陣列存放元素,如果集合已滿,在新增資料的時候,就要分配一塊更大的記憶體,將原來的資料復制過來,釋放之前的記憶體,在插入新增的元素,插入新的資料分在最后插入push_back和通過迭代器在任何位置插入,這里說一下通過迭代器插入,通過迭代器與第一個元素的距離知道要插入的位置,即int index=iter-begin(),這個元素后面的所有元素都向后移動一個位置,在空出來的位置上存入新增的元素,
洗掉元素:洗掉和新增差不多,也分兩種,洗掉最后一個元素pop_back和通過迭代器洗掉任意一個元素erase(iter),通過迭代器洗掉還是先找到要洗掉元素的位置,即int index=iter-begin();這個位置后面的每個元素都想前移動一個元素的位置,同時我們知道erase不釋放記憶體只初始化成默認值,
洗掉全部元素clear:只是回圈呼叫了erase,所以洗掉全部元素的時候,不釋放記憶體,記憶體是在解構式中釋放的,
4、 Win下的可執行程式和Linux下的可執行程式
(1)可執行的二進制檔案包含了:機器指令、資料資源、程式運行資源(物理的和虛擬的記憶體空間、行程、執行緒資源等),因此說明了,可執行檔案執行之前,作業系統要做一些準備作業,根據不同的作業系統,準備作業是不同的,因此可執行檔案的格式是不相同的,Windows下可執行檔案格式為PE格式,linux下可執行檔案為elf格式,所以說,檔案格式的不同導致了可執行檔案是不可以直接跨平臺使用,
(2)由于不同的作業系統API(應用程式介面)不同,而一個可執行檔案要執行時都需要作業系統的互動才能完成,而不同的作業系統互動操作的方法不同,因此不同作業系統下的可執行檔案不能直接在對方那里直接運行,
5、 不同的作業系統是如何支持同一種語言的?
十六、 海康威視(秋招 / C++軟體開發)
1、 手寫代碼:單例模式,
2、 手寫代碼:模板類,
3、 手寫代碼:如何兼用單例模式實作多種不同的單例取用(工廠模式),
4、 手寫代碼:判斷一棵樹是不是平衡二叉樹,
5、 手寫代碼:實作兩個模塊的函式回呼,
6、 談談你對分布式系統的了解,
十七、 烽火通信(秋招 / 軟開)
1、 (專案相關,無其他基礎知識)
十八、 小米(秋招 / 系統開發工程師)
1、 TCP三次握手是什么,請詳細說出每次握手對應的狀態情況,
2、 手寫代碼:實作字串中的單詞逆序輸出(如:“I love Beijing.”逆序輸出為“Beijing. love I”),
3、 Linux作業系統如何用命令查看當前系統使用的編碼方式?
十九、 七二二所
1、 (專案相關,無其他基礎知識)
二十、 七〇九所
1、 (專案相關,無其他基礎知識)
二十一、 浦發銀行(秋招 / 資訊科技崗)
1、 異步和同步、阻塞和非阻塞的區別,
2、 長連接和短連接的區別,舉例長連接和短連接的使用場景,
3、 什么是平衡二叉樹,簡述深度優先遍歷,
二十二、 網易互娛(秋招 / 初級游戲開發)
1、 手寫代碼:將int型整數逆序輸出另一個整數,如12345輸出54321(不能使用string)
2、 手寫代碼:從任意M個數中隨機取出N個不同的數,
3、 行程和執行緒共享的東西都有哪些?
4、 一個空類,一般都默認有哪些函式?
5、 拷貝建構式會在哪些情況下被呼叫?
6、 讓你說出class的大小(比如類中有char、int、static變數的時候)
可能就有人會問了:怎么這些面試題我都沒用遇到過呀?
每家公司的面試題都可能是不一樣的,
面試官也會根據你的簡歷來隨機的出題,
甚至會根據你回答問題的內容來進行深入的考驗,
所有你的面試題和上面這些不一樣是很正常的事情,
加油吧騷年,有機會的 不要害怕悲觀,閉著眼向前沖!
以下分享一下我幾年來具體的學習路線及筆記檔案,希望能幫助到有心提升技術的朋友!
以下完整學習筆記PDF,點擊這里免費下載獲取!點擊這里免費自取!!
架構師筑基必備技能
目前Android APP開發主流語言就是Java語言,Java語言最大的特性就是提高了軟體的互動可能性,可以說安卓手機幾乎所有應用程式都是利用Java語言來進行撰寫的,
JAVA知識要點:
1、 Java序列化、泛型與反射
2、虛擬機底層原理
3、Android記憶體原理
4、 Java高級并發原理詳解
5、 編譯時技術掌握與實戰
6、JDK高級動態代理
7、高級資料結構與演算法
8、 Java IO操作
9、
,,,,

Android R FrameWork原始碼與UI
在Android中,Framework泛指系統架構層,Framework的中文意思是“框架”,在軟體開發中通常指開發框架,在一個系統中處于內核層之上,為頂層應用提供介面,被設計用來幫助開發者快速開發頂層應用,而不必關心系統內核運行機制,通常Framework都會隱藏main函式等應用程式必須的組件,開發人員只需把精力放在功能代碼的實作上,說簡單點,Framework具體的作業也就是為android應用開發的開發人員提供了一系列的服務和API的介面,
UI其實并不是單純指用戶看到的效果,因為在Android開發中,每個控制元件背后都有一套深層次的體系在支撐,自然而然,會UI不單純指的是會自定義控制元件,我們還應該知道自定義控制元件背后的執行流程,包括從Activity的創建,XML的決議,到每個控制元件的測量、布局、繪制,當然在中間還夾雜著比如影片、事件分發機制、嵌套滑動機制等知識點,還有谷歌提供的一些UI框架也使我們要掌握的物件,比如Jetpack組件庫、Material Design等,
知識要點:
1、 FrameWork原始碼決議(SDK 30)
2、Android常用組件深入決議
3、JetPack全家桶
4、Android R新特性決議
,,,,,

大廠內部APP調優方案
性能優化是一個專案必須要經歷的程序,你的應用好與壞都是在用戶使用的程序中反映出來的,如果性能優化沒有做好,對于你的應用來說影響是非常大的,尤其是現在的Android市場競爭非常激烈,如果你的應用體驗沒有競品的好,那么用戶流失是必然的,
性能優化不是一件簡單的事情,每個應用的性能好與壞無法由一個人來決定,因為性能優化的維度有太多了,從我們專案的整體架構,到我們代碼的每一個細節,再到應用使用環境的測驗,只有步步為營,才能做好一個專案的優化,大部分開發者把性能優化指向與不閃退就行,但是實際上性能優化包含了很多方面,比如從簡單的啟動優化、 UI優化、 卡頓優化、 崩潰優化、 安全性優化,到深層次的弱網優化、 大圖加載優化、 儲存優化、 高效傳輸優化、 極限瘦身優化,再到實際開發程序中的OOM問題原理決議、 ANR問題決議、 Crash監控方案,要想把這些優化流程做好,我們不僅從專案架構、代碼規范等方面入手,還用學會利用第三方的檢測工具來檢測專案性能,最主要是,我們需要一套完整的性能優化方案,這正是我們所缺少的,所以我們必須要把缺少的補上, 打造一套真正的完整的性能優化體系,把性能優化流程化,常態化,
1、 APP基礎優化
2、APP深度優化
3、開發焦點問題優化
4、編程效率優化
5、專案實戰
抖音在APK包大小資源優化的實踐
優酷回應式布局技術全決議
網路優化
手機淘寶雙十一性能優化專案揭秘
高德APP全鏈路原始碼依賴分析
徹底干掉OOM的實戰經驗分享
微信Android終端記憶體優化實踐

對標騰訊T3.3架構師
Android框架體系架構(高級UI+FrameWork原始碼) 這塊知識是現今使用者最多的,我們稱之Android2013~2016年的技術,
Android開發者也往往因為網上Copy代碼習慣了而導致對這塊經常“使用”的代碼熟悉而又陌生:熟悉的是幾乎天天在和它們打交道, 天天在復制這些代碼 ;陌生的是雖然天天和這些代碼打交道,但是并沒有深入研究過這些代碼的原理,代碼深處的內涵,
本篇知識要點:
1、架構師設計思想篇
2、 手淘全套架構設計與實作
3、 開源框架
4、OKHttp網路框架
5、一線大廠核心框架剖析與實作

NDK模塊開發(音視頻系列)
NDK(Native Development Kit縮寫)一種基于原生程式介面的軟體開發工具包,可以讓您在 Android 應用中利用 C 和 C++ 代碼的工具,通過此工具開發的程式直接在本地運行,而不是虛擬機,
在Android中,NDK是一系列工具的集合,主要用于擴展Android SDK,NDK提供了一系列的工具可以幫助開發者快速的開發C或C++的動態庫,并能自動將so和Java應用一起打包成apk,
本篇知識要點:
1、NDK開發之C/C++入門
2、JNI模塊開發
3、Linux編程
4、底層圖片處理
5、音視頻開發
6、機器學習

Flutter學習進階
2019 年無疑是 Flutter 技術如火如荼發展的一年,
每一個移動開發者都在為 Flutter 帶來的“快速開發、富有表現力和靈活的 UI、原生性能”的特色和理念而癡狂,從超級 App 到獨立應用,從純 Flutter 到混合堆疊,開發者們在不同的場景下樂此不疲的探索和應用著 Flutter 技術,也在面臨著各種各樣不同的挑戰,
本篇知識要點:
1、Flutter跨平臺開發概述
2、Windows中Flutter開發環境搭建
3、撰寫你的第一個Flutter APP
4、Flutter Dart語言系統入門
…

微信小程式開發
微信小程式作為現在比較火的編程開發應用場景之一,深受市場的青睞,這讓不少開發者眼饞不已,但是對于初學者來說,就完全摸不著頭腦了,不知道微信小程式開發制作需要學習那些知識,有需要的朋友可以參考本篇,
本篇知識要點:
1、小程式概述及入門
2、小程式UI開發
3、API操作
4、購物商場專案實戰

由于篇幅原因,如有需要以上完整學習筆記PDF,可以點擊這里免費自取!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/287763.html
標籤:其他
