1. 程式人生 > >C#刷遍Leetcode面試題系列連載(1) - 入門與工具簡介

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

目錄

  • 為什麼要刷LeetCode
  • 刷LeetCode有哪些好處?
  • LeetCode vs 傳統的 OJ
  • LeetCode刷題時的心態建設
  • C#如何刷遍LeetCode
    • 選項1: VS本地Debug + 線上驗證後提交
    • 選項2: VS Code本地Debug + 在 LeetCode 外掛中驗證和提交

為什麼要刷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 而言有如下優勢:

  • 題基本上都來自於業內大公司的真實面試題
  • 題目不是競賽性質,難度也適中
  • 支援多種主流程式語言C++/C/C#/Python/Java/js/Ruby/PHP/Kotlin等
  • 不用處理輸入輸出問題,可以集中精力解決具體問題
  • 提供Discuss環境,可參考他人程式碼
  • 提供執行用時分佈圖表,可看到自己提交的程式碼在所有已AC程式碼中的執行效率排名

傳統的 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 時,大家還會常用兩個詞:

  • AK(ALL KILL),把比賽中所有題都做出來了,出題方需要考慮防AK策略。

  • 1Y: 第一次提交就正確了,也就是大家常說的“一遍過“

刷題時大家的一致感覺是: 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 + 線上驗證後提交

  • 在本地Visual Studio中建立 .NET Core/Framework 專案
  • 將所生成專案中的 Program.csclass Program改為public class Solution
  • 接下來把相應的程式碼放在類 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 外掛中驗證和提交


安裝C#相關外掛

首先微軟官方 OmniSharp 團隊開發的 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,選擇 .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-nameleetcode136,於是program的具體值為:

"${workspaceFolder}/bin/Debug/netcoreapp3.0/leetcode136.dll"


安裝 LeetCode 外掛

在擴充套件中搜索安裝作者是 ShengChenLeetCode外掛。

然後點選左下角的LeetCode Logo進行登入:

推薦選擇力扣leetcode-cn.com:

在國內使用,網路相對穩定。

然後在 LeetCode 外掛的配置文件中將leetcode.defaultLanguage設定為csharp

接下來就可以愉快地使用LeetCode刷題了。


我們在左側題庫列表中選擇All,找到剛才的例子No.136,雙擊問題標題,可以看到問題描述:

如果需要提交程式碼,只需點右下角的"Code Now"按鈕。

當我們寫完程式碼後,可以點選裡面的程式碼下方的Test進行測試,這便等價於網頁版的按鈕"執行程式碼"。

Test後有圖中3種選項,我一般是使用第一個。除非部分 Test Case 無法通過,才會使用第2個或第3個選項。

此時呢,如果對程式碼比較有信心,可以直接點"提交"按鈕提交程式碼了。

關於VS Code的LeetCode 外掛,文章 LeetCode for VS Code: 春招 Offer 收割利器 中有更詳細的說明。

接下來的 LeetCode面試題系列連載 中每篇文章將會提供解題思路、演算法複雜度的簡要分析、已AC程式碼、提交的答案排名等,敬請期待。


參考資料:

.NET Core and Visual Studio Code
https://code.visualstudio.com/docs/languages/dotnet


相關推薦

C#Leetcode試題系列連載1 - 入門工具簡介

目錄 為什麼要刷LeetCode 刷LeetCode有哪些好處? LeetCode vs 傳統的 OJ LeetCode刷題時的心態建設 C#如何刷遍LeetCode 選項1:

C#Leetcode試題系列連載4:No.633 - 平方數之和

上篇文章中一道數學問題 - 自除數,今天我們接著分析 LeetCode 中的另一道數學題吧~ 今天要給大家分析的面試題是 LeetCode 上第 633 號問題, Leetcode 633 - 平方數之和 https://leetcode.com/problems/sum-of-square-number

C#Leetcode試題系列連載5:No.593 - 有效的正方形

上一篇 LeetCode 面試題中,我們分析了一道難度為 Easy 的數學題 - 自除數,提供了兩種方法。今天我們來分析一道難度為 Medium 的面試題。 系列教程索引 傳送門:https://enjoy233.cnblogs.com/articles/leetcode_csharp_index.htm

Python進階系列連載1——那些容易被忽略的問題

本篇我們來聊一聊一些在入門部分容易被忽略的問題 int()強制轉換浮點數 在int()的強制轉換浮點數時候,不管是正數還是負數,只取整數部分。 注意:這裡不是向上或者向下取整,也不是四捨五入。 無限遞迴 還記得我們講的俄羅斯套娃麼,還記得

美團、滴滴、阿里、京東的 Dubbo / JVM / Spring 試題及答案1

一、阿里巴巴面試題 二、京東面試題 三、美團面試題 四、滴滴面試題 五、總結 目前網際網路公司面試考點為: 1.效能調優、演算法資料機構 2.高併發下資料安全、介面冪等性、原子性等 3.分散式下協同、已經鎖的處理 4.資料庫

Python從零開始系列連載1——安裝環境

前言 人生苦短,我選Python! ★★★★直奔主題!!! 安裝環境 現在,我帶大家裝anaconda,而不是裝Python。因為Python英文是蟒蛇,anaconda是水蟒。大家和我一起搜尋一下anaconda: 在首頁我們可以看到: P

2017 Java開發試題-資料庫篇1

1、儲存過程 --建立 CREATE PROCEDURE pro_name(IN inputName inputType, OUT outputName outputType) BEGIN--sql statement...SELECT ** INTO outputName

C語言試題---指標篇

版本宣告:本文轉載於公眾號TeachPlus C語言面試題---指標篇(三) 了解了記憶體空間,接下來我們就一起看一下指標自身用法的一些題目,先來看這樣一道題目: 分析下面程式碼:` # include <stdio.h> # include

C語言試題---指標篇

版本宣告:本文轉載於公眾號TeachPlus 指標的使用,一直是c語言面試題中必考的部分, 因為指標本身使用的複雜性與普適性,所以考點非常多,而且也可以與其他知識相互結合, 因此我們將會使用五篇專題的篇幅來介紹指標。分析下面的程式,指出程式中的錯誤:

C語言試題---指標篇

# include <stdio.h># include <stdlib.h># include <string.h>void getMemory( char **p , int num){ *p = malloc(num);} int main() {

C語言試題---指標篇

解析:首先看最後一個問題, c  是第一個元素的地址, *c  是第一行元素的首地址,其實第一行元素的地址就是第一個元素的地址, **c  是提取第一個元素。為什麼 c  , *c  的值相等?c是陣列名,是一個二維指標,它的值就是陣列的首地址,也即第一行元素的首地址(等於 *c  ),也等於第一行第一個元素

web前端面試題系列

html name 價值 編程 oct rom repeat 清除 frame 1、列舉你工作中遇到的IE6 BUG,談談解決方案 a.雙倍邊距bug: 例如:當給父元素內第一個浮動元素設置margin-left或margin-right的時候,margin屬性會加倍,

2017年最新企業試題之shell

2017年最新企業面試題之shell2017年最新企業面試題之shell(一)**********************************************企業Shell面試題1:批量生成隨機字符文件名案例 ********************************************

2017年最新企業試題之shell

2017年最新企業面試題之shell(三)2017年最新企業面試題之shell(三)練習題1:寫一個shell腳本,類似於日誌切割,系統有個logrotate程序,可以完成歸檔。但現在我們要自己寫一個shell腳本實現歸檔。舉例: 假如服務的輸出日誌是1.log,我要求每天歸檔一個,1.log第二天就變成1.

轉:.NET試題匯總

轉換 writing 手動 開放 sqlserve XML stat 導入 asp.net 原文地址:http://www.cnblogs.com/yuan-jun/p/6600692.html 1、簡述 private、 protected、 public、 intern

[ 轉載 ] Java線程試題 Top 50 轉載

top cnblogs pan style java log java線程 轉載 -s http://www.cnblogs.com/dolphin0520/p/3958019.html[ 轉載 ] Java線程面試題 Top 50 (轉載)

2018年Android試題含答案

密碼學 進程的地址空間 變量 細節 一段時間 設備驅動 橋梁 異常 graph 這些面試題是我在今年年初換工作的時候整理,沒有重點。包括java基礎,數據結構,網絡,Android相關等等。適合中高級工程師。由於內容過多,將會分為上下兩部分。希望能夠幫到一些朋友,如果幫助到

PHP 試題 PHP部分

list get 一個 目標 span 快速 是把 true sta 1、雙引號和單引號的區別? 雙引號解釋變量,單引號不解釋變量; 雙引號裏插入單引號,其中單引號裏如果有變量的話,變量解釋; 雙引號解釋轉義字符,單引號不解釋轉義字符,但是解釋‘\和\\;

java試題——java高階

四、Java高階部分 1.紅黑樹的實現原理和應用場景; 1.(1)每個節點或者是黑色,或者是紅色。 (2)根節點是黑色。 (3)每個葉子節點(NIL)是黑色。 [注意:這裡葉子節點,是指為空(NIL或NULL)的葉子節點!] (4)如果一個節點是紅色的,則它的子節點必須是黑色的。 (5)從一

華為的JAVA試題及答案部分

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!