C#刷遍Leetcode面試題系列連載(1) - 入門與工具簡介

2021-03-02 大白技術控

點擊藍字「dotNET匠人」關注我喲

加個「星標」,每日 7:15,好文必達!

什麼要刷LeetCode

大家都知道,很多對算法要求高一點的軟體公司,比如美國的FLAGM (Facebook、LinkedIn、Amazon/Apple、Google、Microsoft),或國內大廠BAT、TMD、華為,以及國內新興的 AI 公司等等,都對算法水平有所要求。據悉知名遊戲公司的算法崗收入很高,相應的對算法要求也比較高。而這些公司,大多數會以 LeetCode 中的題目或基於 LeetCode 改進後的自家算法題庫來考察候選人。

於是想進入上述大廠,定期做 LeetCode 題目很有必要。即使沒打算進這些大廠,堅持做LeetCode,個人的算法水平、編程能力也會有較大提升。本文主要介紹 .NET 開發者如何入手刷 LeetCode 面試題。

刷LeetCode有哪些好處?

計算機中有很多抽象的數據結構,比如: List、Stack(棧)、Linked List(鍊表)、Hash Table(哈希表)、Heap(堆)、Tree等等,而LeetCode 上的大量高質量算法題基本上涵蓋了所有這些數據結構的應用。怎麼將這些題抽象成數學模型,轉化為具體數據結構的應用,則是我們需要提升的地方,而這恰恰幫我們極大地提升了自己的抽象思維水平。

每一個算法實現都有其相應的時間複雜度和空間複雜度,而 LeetCode中的一些題對時間複雜度有明確要求,有的要求O(n)即可,有的則要求O(1)才行,否則代碼無法 AC(Accepted)。

比如你上學時用 C++ 刷一遍,工作後再用 C# 刷一遍,最後再用 Python 刷一遍,那麼你對各個語言的代碼量和性能都會有更深地體會,也會知道用哪一種語言具體該怎麼寫出更簡短、更優雅的代碼。

LeetCode vs 傳統的 OJ

中學有NOI信息競賽,大學有ACM算法競賽,按理說應該都有各自的 OJ,這兩類 OJ 不是業內公司的真實面試題。NOI了解的不是特別多,據說以前用 Pascal 語言解題。相應地,我知道有個中學生比較多的 OJ 叫洛谷(https://www.luogu.org/)。而ACM有不少免費 OJ,國內就有一些ACM OJ,比如POJ(北大的)、HDU OJ(杭電的)、ZOJ(浙大的)、HUST OJ(華科的)。另外,還有些職場用的OJ,比如牛客網OJ、浙江大學電腦程式設計能力考試 PTA(拼題A,原全稱為Programming Ability Test,簡稱PAT) 等等。

而國外有 UVAoj http://uva.onlinejudge.org/,

TopCoder (http://www.topcoder.com/tc)等等,另外還記得微軟的校招筆試用的 OJ 是 hihoCoder http://hihocoder.com/。

而 LeetCode 較上述 OJ 而言有如下優勢:

傳統的 OJ 對用戶代碼的判定狀態有如下幾種:

1、Accepted. ——通過!(AC)

2、Wrong Answer.——答案錯。(WA)

3、RunTime Error.——程序運行出錯,意外終止等。(RTE)

4、Time Limit Exceeded. ——超時。程序沒在規定時間內出答案。(TLE)

5、Presentation Error. ——格式錯。程序沒按規定的格式輸出答案。(PE)

6、Memory Limit Exceeded. ——超內存。程序沒在規定空間內出答案。(MLE)

7、Compile Error. ——編譯錯。程序編譯不過。(CE)

而在 LeetCode 中,應該是沒有第5種狀態的。

刷 OJ 時,大家還會常用兩個詞:

刷題時大家的一致感覺是: AC一時爽,一直AC一直爽!

LeetCode刷題時的心態建設

在本文開頭,我們提到了很多行內名廠需要考察與 LeetCode 難度難度相當的算法題。但需要注意的是,面試時很可能面試官會對題目的解題要求進行另外的調整,比如要求更低的時間複雜度、更低的空間複雜度之類的,所以呢,面試算法題很重要的是要和面試官保持即時的溝通,而不是一上來就埋頭寫代碼。

有的人刷 LeetCode 中 難度為 Easy 和 Medium 的題3遍左右後成功拿到微軟Offer,還是Special Offer!也有人刷完LeetCode很多遍,也沒能拿到大廠Offer呢。

更多算法題面試要點請參看一畝三分地論壇站長Warald 的文章 Leetcode刷題五遍還沒offer!舉例分析為什麼找工作光刷題不夠 .

C#如何刷遍LeetCode

在 LeetCode 中提交 C# 代碼有兩種主流方式,下面以 LeetCode 中的136號題為例來說明。

該題的中文版網址為: https://leetcode-cn.com/problems/single-number/,將代碼語言選為C#,則默認的接口代碼如下:

public class Solution {

public int SingleNumber(int[] nums) {

}

}


選項1:VS本地Debug + 在線驗證後提交

如果需要本地測試,只需在該類裡面加入 主函數即可,然後在 主函數中調用相應的函數,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插件中驗證和提交安裝C#相關插件

首先微軟官方 OmniSharp 團隊開發的 C# 插件是必須安裝的,

另外再安裝一下第3個插件,則對C#代碼基本的智能感知,關鍵字高亮等功能就可以順利使用了。

配置 .NET Core運行環境

先安裝 .NET Core SDK 3.0,到官網 https://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.

在VS Code中Debug C#

這裡我們直接使用剛才帶主函數的本地測試代碼吧,將代碼先拿過來,然後按 F5,選擇 .NETCore,具體操作見下圖:

在配置文件 launch.json中,我們需要選擇類型的是 .NET:Launch.NETCoreConsoleApp.

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"

安裝 LeetCode 插件

在擴展中搜索安裝作者是 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

https://code.visualstudio.com/docs/languages/dotnet

使用VS Code 開發.NET CORE 程序指南

https://www.cnblogs.com/xboo/p/11431222.html

作者簡介:Bravo Yeung,計算機碩士,知乎乾貨答主(獲73K 贊同, 34K 感謝, 210K 收藏)。曾在國內 Top3網際網路視頻直播公司短暫工作過,後加入一家外企做軟體開發至今。

歡迎在留言區留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發,學習能力的提升上有新的認識,歡迎轉發分享給更多人。

歡迎各位讀者加入 .NET技術交流群,在公眾號後臺回復「加群」或者「學習」即可。

微信後臺回復「ebook」,給你:一份全網最強的電子書下載指南。回復「運營工具箱」,給你:一整套運營工具,學會後極大地提到運營效率!

你點的每一個"在看"

我都當成了喜歡!

相關焦點

  • C#刷遍Leetcode面試題系列連載(2): No.38 - 報數
    前言前文傳送門:C#
  • leetcode刷題最強指南(版本1.0)
    所以我整理了這篇leetcode刷題最強指南:一個超級詳細的刷題順序,每道題目都是我精心篩選,都是經典題目高頻面試題,大家只要按照這個順序刷就可以了,你沒看錯,就是題目順序都排好了,文章順序就是刷題順序!挨個刷就可以,不用自己再去題海裡選題了!
  • Leetcode刷題五遍還沒offer!舉例分析為什麼找工作光刷題不夠
    一畝三分地就業求職版裡,有位同學發帖說:LZ從14年秋季入學開始刷題,一門心思要找份好工作,到現在leetcode已經刷過五遍,都做好詳盡的總結,看過geeksforgeeks裡面一半的topic。。。今年形勢不行,上學期只拿到了微軟,google, tableau和bloomberg的面試。
  • 一個月帶你狂刷算法Leetcode題,衝刺最後秋招!
    >知識:主要是指你對machine learning相關知識和理論的儲備工具:將你的machine learning知識應用於實際業務的工具邏輯:你的舉一反三的能力,你解決問題的條理性,你發散思維的能力,你的聰明程度業務:深入理解所在行業的商業模式,從業務中發現motivation並進而改進模型算法的能力作者王喆表示:這四點是面試官在"限定的時間內
  • leetcode 刷500道題,筆試/面試穩嗎?
    如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?這裡我說下我的個人看法,我認為不穩。下面說說為啥不穩以及算法題應該如何刷、如何學才比較好,當然,也會推薦自己學過的資料。一、先說說筆試題在刷 leetcode 的時候,你會發現,每道題的題意都很短,你只需要花十幾秒的時間,就知道這道題是要你幹嘛了,並且每道題所用道的算法思想都很明確,動態規劃、遞歸、二分查找等,你可能很快就知道該用哪種方法,只是你不懂如何把代碼寫出來而已。
  • LeetCode按照怎樣的順序來刷題比較好?
    分享一下身邊大神的刷題順序:如果你時間比較緊迫,為了找工作而刷題,我建議你先刷熱門推薦,一共兩百多道題。先刷熱題 HOT 100,再刷精選 TOP 面試題,之後刷其他的題。刷題方法:第一遍:可以先思考,之後看參考答案刷,結合其他人的題解刷。思考、總結並掌握本題的類型,思考方式,最優題解。第二遍:先思考,回憶最優解法,並與之前自己寫過的解答作比對,總結問題和方法。
  • 【SQL刷題系列】:leetcode180 Consecutive Numbers
    點擊上方 ↑ 藍色關注「Python數據科學」SQL刷題系列:SQL作為一種資料庫查詢和程序設計語言,是從事數據技術人員必備的技能,也是各大公司的數據分析、數據挖掘、資料庫等筆試題必考的一種題。為此,Python數據科學開啟了SQL刷題的系列,希望可以幫助有需要的朋友們。
  • 帶你狂刷算法Leetcode題!短時間內快速獲得實戰能力!
    但對於初學者來說,很容易沉迷在刷題的數量中,覺得如果能刷完這1000道題,自己一定能夠有所飛躍。但實際上,低效率的重複對你來說,根本就無法掌握到解題的精髓,一旦題目有所變動,就無法舉一反三。那究竟應該怎麼刷題才高效呢?
  • 春節大禮包|刷題技巧+80道Leetcode
    為了跳槽,我前兩年的春節都是在刷題中度過的,目前為止刷了小四百道leetcode,也算是有一些經驗,今天就跟大家分享下學習方法和我總結的乾貨。後來發現了 Leetbook[1] 這個寶藏,才算是找到了適合自己的刷題方法。
  • LeetCode 刷題指南(1):為什麼要刷題
    ,不過不可否認刷題確實能鍛鍊我們的編程能力,相信每個認真刷題的人都會有體會。LeetCode 是一個非常棒的 OJ(Online Judge)平臺,收集了許多公司的面試題目。相對其他 OJ 平臺而言,有著下面的幾個優點:下面是我刷 LeetCode 的一些收穫,希望能夠引誘大家有空時刷刷題目。
  • 【Leetcode刷題練Python】1. 兩數之和
    Leetcode,這個大名鼎鼎的刷題神器,對於將要入行碼農行業或已是碼農的猿猿們來說,是必不可少的的練習工具。但可能還有很多小猿們還不知道它。
  • 字節大佬Leetcode刷題筆記,看完吊打問你算法的面試官
    介紹leetcode 題解,記錄自己的 leetcode 解題之路。目前分為五個部分:第一個部分是 leetcode 經典題目的解析,包括思路,關鍵點和具體的代碼實現。第二部分是對於數據結構與算法的總結第三部分是 anki 卡片, 將 leetcode 題目按照一定的方式記錄在 anki 中,方便大家記憶。
  • 刷題兩個月,從入門到字節跳動offer,這是我的模板|GitHub1.2k星
    白交 發自 凹非寺量子位 報導 | 公眾號 QbitAI刷題應該這樣刷。最近,一位網友在GitHub上分享了他自己的一個算法模版,瞬間斬獲1.2k星。第三步,劍指offer劍指offer基本上是大部分公司的出題源頭,刷題面試中基本會遇到現題或者變形題,刷完這三部分,大部分國內公司的面試題應該都沒有問題了。另外,作者還溫馨提示:刷題時間要合理分配。
  • leetcode 刷500道題,筆試/面試穩嗎?別以為你自己穩了
    來源公眾號:苦逼的碼農作者:帥地想要學習算法、應付筆試或者應付面試手撕算法題,相信大部分人都會去刷 Leetcode,有讀者問?如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?
  • 你面試穩了!通關LeetCode刷題完整攻略,省時又高效
    DP課程題目合集的傳送門:窮碼農:動態規劃及面試,學完這一篇,你就入門了:Dynamic Programming, 動態規劃,經典題目[2]以上。更新一下國外LeetCode大神們是怎麼刷LeetCode的:窮碼農:LeetCode到底應該怎麼刷?面試應該注意哪些問題?大公司到底怎麼進?來看看LC大神們的刷題攻略!
  • leetcode刷對了麼
    今天,逆行君就帶你從世界觀和方法論兩方面走進「leetcode」 leetcode之世界觀 什麼是leetcode 簡單來說,leetcode是一個美國的在線編程網站,它收集了各大公司的經典算法面試題,用戶可以選擇不同的語言進行代碼的在線編寫、編譯和調試。
  • 【SQL刷題系列】:leetcode183 Customers Who Never Order
    (點擊上方藍色,快速關注)SQL刷題系列:SQL作為一種資料庫查詢和程序設計語言,是從事數據技術人員必備的技能
  • 如何科學的刷 Leetcode
    它是一個編程實踐網站,主要注重於培養使用者的編程技巧,去解決一些巧妙的算法題。這是它的官網,https://leetcode.com。Leetcode 官網很久以前,還是在大學的時候,有師兄對我意味深長的說,如果把 Leetcode 上面的題目做上七遍,就有很大概率能夠通過谷歌的面試。
  • 程式設計師跳槽面試刷題必備,微軟工程師放大招!| 程式設計師硬核評測
    跳槽後薪水翻倍自然爽歪歪,但最怕的是面試翻車,那就悲劇了。可想而知,想要跳槽或者為春招準備的畢業生們,正在為刷算法題焦頭爛額。別怕,CSDN 又來助你一臂之力了,當然不是只給你說雞湯打氣加油的。這一次,還是給你實用、可執行、能快速上手(臨時抱佛腳)的工具。
  • 刷LeetCode 對於國內 IT 企業面試幫助大嗎?
    今年大三,大四要找工作了,沒搞過ACM(其實挺後悔的),校招面試都考算法的,我這種沒搞過ACM的感覺挺沒競爭力的,同學有推薦leetcode的,不知對於國內的IT企業面試幫助大嗎?對於 BAT 等一線大廠來說,算法面試是必須跨過去的一道坎,所以必須得準備好算法面試~但很多時候,你即使提前複習了這些最常見的面試算法題,你依舊無法通過算法面試!為什麼?你在提前準備複習的時候,在網上找了半天響應題目的分析文章,但你看了就是不懂。你在面試的時候,卡殼了,一時間忘了怎麼寫代碼了我來助你一臂之力!!