去年,螞蟻一面的一道筆試題,中等難度

2021-10-20 18:22:11 字數 3154 閱讀 5003

你好,我是 yes。

最近不是跳槽季嘛,今兒我就來分享一道我之前遇到的筆試題(上機寫**,這裡統稱筆試),這道題遇到的機率還是比較高的。

很多人可能準備去一波阿里或者其他大廠,而這些大廠面試過程一般都會有筆試。

不過有很多人可能沒經歷過筆試,所以我先分享一下我之前面螞蟻金服時候的筆試經歷。

一般沒特意去練練是真的不習慣的

當時我在經歷了 1 個多小時的 bb 之後,面試官就讓我開啟郵箱,會有這麼一條郵件。

當然現在截圖上是沒題目的,但真正面試的時候介面上就能看到面試官已經給你準備好的題目。

我當時的題目是實現個 lru,面試官給了介面的定義,然後一些使用方法,以及一些注釋說明。

一般而言,看個注釋和使用方式就可以得知要實現什麼東西了。

這裡要注意,不理解題目的要問清楚,不要自己瞎理解,不然咱就漸行漸遠了。

​還有一點要注意,這裡寫**是不會聯想的,是不會聯想的,是不會聯想的

因此所有的類名、方法名都得你乙個字母乙個字母的敲。

這對於習慣用 ide 的我們來說,是個致命打擊

你可以試試看看優先佇列、鎖這些類名能不能敲出來。

其實這些名字還好,打個**不離十也差不多了,就是一些方法名想不起來就很蛋疼,所以一些常用的還是得注意一下。

如果你實在敲不出來,次一級做法就是和面試官說你得在 idea 裡面打。

我之前問過一位在螞蟻的小姐姐,她說最好是在網頁上敲了,網頁上敲的話基本上只會看邏輯,不會執行,也不會扣的太細。

如果你拷到 idea 上寫的話,那面試官估計得把你**要拷下來運一運,而且可能會問的比較細。

畢竟網頁上寫**,面試官是能實時看到的,idea 可看不到

基本上就是這個樣子了,我當時在網頁上寫的,面試官順著邏輯看一遍就 ok 了。

再說下筆試的小技巧

我推薦先和面試官說我能在紙上畫畫嗎?答案肯定是能。

然後在紙上畫畫圖,理一理思路,然後把思路講出來給面試官聽,得到一些反饋

畢竟面試是要交流的。

思路得到認可了,那就大膽的寫唄,就怕一開始思路就是錯的,然後埋頭寫。

或者沒一點思路,埋著頭,像執行緒被阻塞一樣。

要注意交流

至於題目的話,推薦自頂向下的寫。

舉個經典的例子:排序裡面陣列交換資料。

int temp = array[j]                

array[j] = array[j + 1]

array[j + 1] = temp

這種一般都會封裝成 swap 方法

書寫的時候就直接先寫個 swap 方法,當做已經實現了邏輯,然後之後再補上實現。

這樣思路先沿著主線執行完,然後再去完成支線,在面試場景尤為重要,畢竟那時候是緊張的。

這個 swap 可能太簡單的感受不到,看看下面的題就能感受到了。

回到我之前的那個筆試題,lru。

至於 lru 是什麼我就不提了,不明白的同學自行查閱下,我們直接看題目。

public class lrucache  

public v get(k k)

public void put(k k, v v)

}

當時面試官給的就這麼個類,幾個未實現的方法,還有個 main 方法我就沒寫了,就是使用例子。

現在你可以停下,思考下,你看看這樣你能寫的出來不?

好了,我貼下答案,這題 leetcode 上也有的,第 146 題,可以去練練。

public class lrucache

public node(k key, v value)

}private int capacity;

private hashmapmap;

private nodehead;

private nodetail;

public lrucache(int capacity)

public v get(k key)

movenodetohead(node);

return node.value;

}public void put(k key, v value)

nodenewnode = new node<>(key, value);

map.put(key, newnode);

addtohead(newnode);

} else

}private void addtohead(nodenewnode)

private void movenodetohead(nodenode)

private void removenode(nodenode)

private void removetailnode()

public static void main(string args)

}

這個題目就適合我上面說的自頂向下了。

addtoheadmovenodetoheadremovenode這幾個我建議在主流程寫完之前不要實現,把 get、put 寫完之後,再實現邏輯,這樣比較清晰,也不會亂

這種,我稱之為自頂向下或者 bfs 寫法

lru還有一種取巧的實現,就是利用linkedhashmap,繼承實現removeeldestentry方法,這種很簡單,不過面試官不會讓你用這種的,因為我當時提了哈哈哈。

鍊錶類題目或者二叉樹之類的在紙上畫畫,還是比較容易的。

題目就分享到這兒了。

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道筆試題

上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...

一道筆試題

題目是這樣的 判斷乙個小於1000的正整數是否為素數。素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最...