你們都知道,不少對算法要求高一點的軟件公司,好比美國的FLAGM (Facebook、LinkedIn、Amazon/Apple、Google、Microsoft),或國內大廠BAT、TMD、華爲,以及國內新興的 AI 公司等等,都對算法水平有所要求。據悉知名遊戲公司的算法崗收入很高,相應的對算法要求也比較高。而這些公司,大多數會以 LeetCode 中的題目或基於 LeetCode 改進後的自家算法題庫來考察候選人。html
因而想進入上述大廠,按期作 LeetCode 題目頗有必要。即便沒打算進這些大廠,堅持作LeetCode,我的的算法水平、編程能力也會有較大提高。本文主要介紹 .NET 開發者如何入手刷 LeetCode 面試題。面試
計算機中有不少抽象的數據結構,好比: List、Stack(棧)、Linked List(鏈表)、Hash Table(哈希表)、Heap(堆)、Tree等等,而LeetCode 上的大量高質量算法題基本上涵蓋了全部這些數據結構的應用。怎麼將這些題抽象成數學模型,轉化爲具體數據結構的應用,則是咱們須要提高的地方,而這偏偏幫咱們極大地提高了本身的抽象思惟水平。算法
每個算法實現都有其相應的時間複雜度和空間複雜度,而 LeetCode中的一些題對時間複雜度有明確要求,有的要求O(n)便可,有的則要求O(1)才行,不然代碼沒法 AC(Accepted)。編程
好比你上學時用 C++ 刷一遍,工做後再用 C# 刷一遍,最後再用 Python 刷一遍,那麼你對各個語言的代碼量和性能都會有更深地體會,也會知道用哪種語言具體該怎麼寫出更簡短、更優雅的代碼。json
中學有NOI信息競賽,大學有ACM算法競賽,按理說應該都有各自的 OJ,這兩類 OJ 不是業內公司的真實面試題。NOI瞭解的不是特別多,聽說之前用 Pascal 語言解題。相應地,我知道有個中學生比較多的 OJ 叫洛谷(www.luogu.org/)。而ACM有很多免費 OJ,國內就有一些ACM OJ,好比POJ(北大的)、HDU OJ(杭電的)、ZOJ(浙大的)、HUST OJ(華科的)。另外,還有些職場用的OJ,好比牛客網OJ、浙江大學計算機程序設計能力考試 PTA(拼題A,原全稱爲Programming Ability Test,簡稱PAT) 等等。bash
而國外有 UVAoj uva.onlinejudge.org/,TopCoder (www.topcoder.com/tc)等等,另外還記得微軟的校招筆試用的 OJ 是 hihoCoder hihocoder.com/。網絡
而 LeetCode 較上述 OJ 而言有以下優點:數據結構
執行用時分佈圖表
,可看到本身提交的代碼在全部已AC代碼中的運行效率排名傳統的 OJ 對用戶代碼的斷定狀態有以下幾種:app
一、Accepted. ——經過!(AC)編程語言
二、Wrong Answer.——答案錯。(WA)
三、RunTime Error.——程序運行出錯,意外終止等。(RTE)
四、Time Limit Exceeded. ——超時。程序沒在規定時間內出答案。(TLE)
五、Presentation Error. ——格式錯。程序沒按規定的格式輸出答案。(PE)
六、Memory Limit Exceeded. ——超內存。程序沒在規定空間內出答案。(MLE)
七、Compile Error. ——編譯錯。程序編譯不過。(CE)
而在 LeetCode 中,應該是沒有第5種狀態的。
刷 OJ 時,你們還會經常使用兩個詞:
AK(ALL KILL),把比賽中全部題都作出來了,出題方須要考慮防AK
策略。
1Y: 第一次提交就正確了,也就是你們常說的「一遍過「
刷題時你們的一致感受是: AC一時爽,一直AC一直爽!
在本文開頭,咱們提到了不少行內名廠須要考察與 LeetCode 難度難度至關的算法題。但須要注意的是,面試時極可能面試官會對題目的解題要求進行另外的調整,好比要求更低的時間複雜度、更低的空間複雜度之類的,因此呢,面試算法題很重要的是要和麪試官保持即時的溝通,而不是一上來就埋頭寫代碼。
有的人刷 LeetCode 中 Easy 和 Medium的題3遍左右後成功拿到微軟Offer,仍是Special Offer!也有人刷完LeetCode不少遍,也沒能拿到大廠Offer呢。
更多算法題面試要點請參看一畝三分地論壇站長Warald 的文章 Leetcode刷題五遍還沒offer!舉例分析爲何找工做光刷題不夠 .
在 LeetCode 中提交 C# 代碼有兩種主流方式,下面以 LeetCode 中的136號題爲例來講明。
該題的中文版網址爲: leetcode-cn.com/problems/si…,將代碼語言選爲C#,則默認的接口代碼以下:
public class Solution {
public int SingleNumber(int[] nums) {
}
}
複製代碼
選項1
: VS本地Debug + 在線驗證後提交Program.cs
中 class Program
改成public class Solution
若是須要本地測試,只需在該類裏面加入主函數
便可,而後在主函數
中調用相應的函數,debug,觀察調用時的各項值。
使用LeetCode的"執行代碼"案例能夠測試當前的測試用例,而界面上的"測試用例"能夠自行修改。
若是此時對代碼比較有信心,能夠直接點"Test"按鈕左側的"Submit"按鈕提交代碼了。
若是不幸,部分Test case沒法經過,則可進行本地debug,下面是我給出的樣例代碼:
using System;
using System.Collections.Generic;
using System.Linq;
namespace leetcoce136
{
public class Solution
{
public int SingleNumber(int[] nums) {
int res = 0;
Dictionary<int, int> dict = new Dictionary<int, int>();
foreach (var num in nums)
{
if (!dict.ContainsKey(num))
{
dict.Add(num, 1);
}
else
dict[num]++;
}
res = dict.FirstOrDefault(kv => kv.Value == 1).Key;
return res;
}
public static void Main() {
var sol = new Solution();
int[] input = { 4, 1, 2, 1, 2 };
System.Console.WriteLine(sol.SingleNumber(input));
}
}
}
複製代碼
選項2
: VS Code本地Debug + 在 LeetCode 插件中驗證和提交首先微軟官方 OmniSharp 團隊開發的 C# 插件是必須安裝的,
先安裝 .NET Core SDK 3.0,到官網 dotnet.microsoft.com/download 下載安裝便可。
首先在 VS Code下方的Terminal窗口中依次輸入以下命令:
$ dotnet --version
3.0.100-preview5-011362
$ cd d:/Coding/csLeetcode
$ dotnet new console -o "leetcoce136"
複製代碼
這裏假設你以及有文件夾d:/Coding/csLeetcode
.
C#
這裏咱們直接使用剛纔帶主函數的本地測試代碼吧,將代碼先拿過來,而後按F5
,選擇 .NET Core
,具體操做見下圖:
在配置文件launch.json
中,咱們須要選擇類型的是 .NET: Launch .NET Core Console App
.
launch.json
的完整配置過程以下:
接下來咱們須要修改其中的屬性值 program
:
默認的值爲 "program": "${workspaceFolder}/bin/Debug/<target-framework>/<project-name.dll>"
其中的<target-framework>
是指目標運行環境,其具體版本能夠在上面還原的項目文件leetcoce136.csproj
中看到:
而咱們的項目名,即project-name
是leetcode136
,因而program
的具體值爲:
"${workspaceFolder}/bin/Debug/netcoreapp3.0/leetcode136.dll"
在擴展中搜索安裝做者是 ShengChen
的LeetCode
插件。
而後點擊左下角的LeetCode Logo進行登陸:
推薦選擇力扣leetcode-cn.com
:
在國內使用,網絡相對穩定。
而後在 LeetCode 插件的配置文檔中將leetcode.defaultLanguage
設置爲csharp
。
其完整操做過程以下:
接下來就能夠愉快地使用LeetCode刷題了。
咱們在左側題庫列表中選擇All
,找到剛纔的例子No.136,雙擊問題標題,能夠看到問題描述:
若是須要提交代碼,只需點右下角的"Code Now"按鈕。
當咱們寫完代碼後,能夠點擊裏面的代碼下方的Test
進行測試,這便等價於網頁版的按鈕"執行代碼"。
點Test
後有圖中3種選項,我通常是使用第一個。除非部分 Test Case 沒法經過,纔會使用第2個或第3個選項。
此時呢,若是對代碼比較有信心,能夠直接點"Test"按鈕左側的"Submit"按鈕提交代碼了。
關於VS Code的LeetCode 插件,文章 LeetCode for VS Code: 春招 Offer 收割利器 中有更詳細的說明。
接下來的 LeetCode面試題系列連載 中每篇文章將會提供解題思路、算法複雜度的簡要分析、已AC代碼、提交的答案排名等,敬請期待。
參考資料:
.NET Core and Visual Studio Code code.visualstudio.com/docs/langua…
使用VS Code 開發.NET CORE 程序指南 www.cnblogs.com/xboo/p/1143…