一天面三面,兩場技術面一個HR面。
第一面 技術 面試官 技術支持部門的大佬
1. 自我介紹 我羅嗦很多 小哥哥一直沒打斷我
2. 問了我一些論文的細節
3. 聊項目細節
中間貌似問了一些虛擬機還有分佈式的東西 但是我真的想不起來了。。
4. 做一道題 兩個無序數組合並 然後寫歸併
5. 拿出了我的筆試記錄 問我爲甚嗎最後一題沒寫 我說沒時間了 倒數第二題卡住了90ac 然後讓我講一下思路
6 你有什麼想問我的嗎 問了公司的部門情況和入職之後的自身發展
二面 一個很像日本小哥哥的面試官
1. 問了項目 可能是我太渣 居然問我你對功能框架這麼感興趣爲啥不做產品經理?!!
2. 虛擬內存講一下。如果內存重組還會用虛擬內存嗎?
物理內存和虛擬內存是同時使用的,並不會等到物理內存用盡再使用,因爲虛擬內存裏面的內容必須要導入到物理內存中纔可以進行操作的!物理內存一旦耗盡,如何再把虛擬內存裏面的東西導入物理內存中?
虛擬內存的意義就在於把一些你暫時不用的內存暫存到頁面文件中(就是虛擬內存),等到你要使用的時候再把它們導入到內存裏面,打個比方,你現在開了十個網頁,然後你再打開某個遊戲進去玩它半個小時,退出遊戲之後你再去看網頁的話就會發現讀取某個網頁的時候會卡一下,這就是由於網頁裏面的內容被放到虛擬內存裏面了,要重新導入到內存中
3. TCP UDP 三次握手 四次揮手
4. 設計一個商品的表結構 (我真的漲知識了)我說了 商品ID 商品名 商品描述 商家ID 商品庫存 商品銷量 商品價格 商品評價
然後問我 一個商品往往有多個不同屬性所對應不同價格怎麼辦?我說那需要哈希一下啊。
面試官:沒有hash這種數據結構啊
我: 那。。。再建一個表?
5. 你是用Java的是吧 用什麼版本? 介紹下Java 1.8和1.7的區別?
6 做一個題 最長字符串匹配
- 最長子序列:匹配的字符不需要連續。
- 最長子串: 匹配的字符需要連續,可能有多種結果。
解決思路:將輸入字符串1看作行, 輸入字符串2看作列,構成二位數組,然後將對角線匹配字符的值標記爲1,計算滿足條件的匹配字符個數即可。
基本思想: 空間換時間,動態規劃。
圖解與公式(只針對最長子序列,最長子串類似)
狀態轉移方程
最長子序列(可以不連續)
/**
* find longest common sequence from two input string
* @param s1
* @param s2
* @return length of longest common sequence
*/
public static int LCS(String s1, String s2) {
int[][] c = new int[s1.length()][s2.length()];
// initialize the elements without top left element
for(int i=0; i<s1.length();i++){
if (s1.charAt(i) == s2.charAt(0)) {
c[i][0] = 1;
}
}
for(int j = 0; j<s2.length();j++){
if (s1.charAt(0) == s2.charAt(j)) {
c[0][j] = 1;
}
}
for (int i = 1; i < s1.length(); i++) {
for (int j = 1; j < s2.length(); j++) {
if (s1.charAt(i) == s2.charAt(j)) {
c[i][j] = c[i - 1][j - 1] + 1;
} else if (c[i][j - 1] > c[i - 1][j]) {
c[i][j] = c[i][j - 1];
} else {
c[i][j] = c[i - 1][j];
}
}
}
return c[s1.length() - 1][s2.length() - 1];
}
最長字串(連續)
/**
* find longest substring from two input string
*
* @param s1
* @param s2
* @return length of longest substring
*/
public static int LSS(String s1, String s2) {
int[][] c = new int[s1.length()][s2.length()];
int max = 0;
// initialize the elements without top left element
for(int i=0; i<s1.length();i++){
if (s1.charAt(i) == s2.charAt(0)) {
c[i][0] = 1;
}
}
for(int j = 0; j<s2.length();j++){
if (s1.charAt(0) == s2.charAt(j)) {
c[0][j] = 1;
}
}
for (int i = 1; i < s1.length(); i++) {
for (int j = 1; j < s2.length(); j++) {
if (s1.charAt(i) == s2.charAt(j)) {
c[i][j] = c[i - 1][j - 1] + 1;
if (c[i][j] > max) {
max = c[i][j];
}
}
}
}
return max;
}