C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>系列教程索引</li><li>为什么要刷LeetCode</li><li>刷LeetCode有哪些好处?</li><li>LeetCode vs 传统的 OJ</li><li>LeetCode刷题时的心态建设</li><li>C#如何刷遍LeetCode<ul><li><code>选项1</code>: VS本地Debug + 在线验证后提交</li><li><code>选项2</code>: VS Code本地Debug + 在 LeetCode 插件中验证和提交<ul><li>安装C#相关插件</li><li>配置 .NET Core运行环境</li><li>在VS Code中Debug <code>C#</code></li><li>安装 LeetCode 插件</li></ul></li><li>文末彩蛋</li></ul></li></ul></div><p></p><h2 id="系列教程索引">系列教程索引</h2>
<p>传送门:https://enjoy233.cnblogs.com/articles/leetcode_csharp_index.html</p>
<ol>
<li>C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介</li>
<li>C#刷遍Leetcode面试题系列连载(2): No.38 - 报数</li>
<li>C# 刷遍 Leetcode 面试题系列连载(3): No.728 - 自除数</li>
</ol>
<h2 id="为什么要刷leetcode">为什么要刷LeetCode</h2>
<p>大家都知道,很多对算法要求高一点的软件公司,比如美国的FLAGM (Facebook、LinkedIn、Amazon/Apple、Google、Microsoft),或国内大厂BAT、TMD、华为,以及国内新兴的 AI 公司等等,都对算法水平有所要求。据悉知名游戏公司的算法岗收入很高,相应的对算法要求也比较高。而这些公司,大多数会以 LeetCode 中的题目或基于 LeetCode 改进后的自家算法题库来考察候选人。</p>
<p>于是想进入上述大厂,定期做 LeetCode 题目很有必要。即使没打算进这些大厂,坚持做LeetCode,个人的算法水平、编程能力也会有较大提升。本文主要介绍 .NET 开发者如何入手刷 LeetCode 面试题。</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185001637-1257384603.png" alt="leetcode" loading="lazy"></p>
<br>
<h2 id="刷leetcode有哪些好处">刷LeetCode有哪些好处?</h2>
<ul>
<li><strong>提升抽象思维水平</strong></li>
</ul>
<p>计算机中有很多抽象的数据结构,比如: List、Stack(栈)、Linked List(链表)、Hash Table(哈希表)、Heap(堆)、Tree等等,而LeetCode 上的大量高质量算法题基本上涵盖了所有这些数据结构的应用。怎么将这些题抽象成数学模型,转化为具体数据结构的应用,则是我们需要提升的地方,而这恰恰帮我们极大地提升了自己的抽象思维水平。</p>
<ul>
<li><strong>时刻对时间、空间复杂度有所掌控</strong></li>
</ul>
<p>每一个算法实现都有其相应的时间复杂度和空间复杂度,而 LeetCode中的一些题对时间复杂度有明确要求,有的要求O(n)即可,有的则要求O(1)才行,否则代码无法 AC(Accepted)。</p>
<ul>
<li><strong>对各个语言有更深的理解</strong></li>
</ul>
<p>比如你上学时用 C++ 刷一遍,工作后再用 C# 刷一遍,最后再用 Python 刷一遍,那么你对各个语言的代码量和性能都会有更深地体会,也会知道用哪一种语言具体该怎么写出更简短、更优雅的代码。</p>
<br>
<h2 id="leetcode-vs-传统的-oj">LeetCode vs 传统的 OJ</h2>
<p>中学有NOI信息竞赛,大学有ACM算法竞赛,按理说应该都有各自的 OJ,这两类 OJ 不是业内公司的真实面试题。NOI了解的不是特别多,据说以前用 Pascal 语言解题。相应地,我知道有个中学生比较多的 OJ 叫<strong>洛谷</strong>(https://www.luogu.org/)。而ACM有不少免费 OJ,国内就有一些ACM OJ,比如POJ(北大的)、HDU OJ(杭电的)、ZOJ(浙大的)、HUST OJ(华科的)。另外,还有些职场用的OJ,比如牛客网OJ、浙江大学计算机程序设计能力考试 PTA(拼题A,原全称为Programming Ability Test,简称<em>PAT</em>) 等等。</p>
<p>而国外有 UVAoj http://uva.onlinejudge.org/,TopCoder (http://www.topcoder.com/tc)等等,另外还记得微软的校招笔试用的 OJ 是 hihoCoder http://hihocoder.com/。</p>
<p>而 LeetCode 较上述 OJ 而言有如下优势:</p>
<ul>
<li>题基本上都来自于业内大公司的真实面试题</li>
<li>题目不是竞赛性质,难度也适中</li>
<li>支持多种主流编程语言C++/C/C#/Python/Java/js/Ruby/PHP/Kotlin等</li>
<li>不用处理输入输出问题,可以集中精力解决具体问题</li>
<li>提供Discuss环境,可参考他人代码</li>
<li>提供<code>执行用时分布图表</code>,可看到自己提交的代码在所有已AC代码中的运行效率排名</li>
</ul>
<p>传统的 OJ 对用户代码的判定状态有如下几种:</p>
<p>1、Accepted. ——通过!(AC)</p>
<p>2、Wrong Answer.——答案错。(WA)</p>
<p>3、RunTime Error.——程序运行出错,意外终止等。(RTE)</p>
<p>4、Time Limit Exceeded. ——超时。程序没在规定时间内出答案。(TLE)</p>
<p>5、Presentation Error. ——格式错。程序没按规定的格式输出答案。(PE)</p>
<p>6、Memory Limit Exceeded. ——超内存。程序没在规定空间内出答案。(MLE)</p>
<p>7、Compile Error. ——编译错。程序编译不过。(CE)</p>
<p>而在 LeetCode 中,应该是没有第5种状态的。</p>
<p>刷 OJ 时,大家还会常用两个词:</p>
<ul>
<li>
<p><strong>AK(ALL KILL)</strong>,把比赛中所有题都做出来了,出题方需要考虑<code>防AK</code>策略。</p>
</li>
<li>
<p><strong>1Y</strong>: 第一次提交就正确了,也就是大家常说的“一遍过“</p>
</li>
</ul>
<p>刷题时大家的一致感觉是: AC一时爽,一直AC一直爽!</p>
<br>
<h2 id="leetcode刷题时的心态建设">LeetCode刷题时的心态建设</h2>
<p>在本文开头,我们提到了很多行内名厂需要考察与 LeetCode 难度难度相当的算法题。但需要注意的是,面试时很可能面试官会对题目的解题要求进行另外的调整,比如要求更低的时间复杂度、更低的空间复杂度之类的,所以呢,面试算法题很重要的是要和面试官保持即时的沟通,而不是一上来就埋头写代码。</p>
<p>有的人刷 LeetCode 中 Easy 和 Medium的题3遍左右后成功拿到微软Offer,还是Special Offer!也有人刷完LeetCode很多遍,也没能拿到大厂Offer呢。</p>
<p>更多算法题面试要点请参看<strong>一亩三分地</strong>论坛站长Warald 的文章 Leetcode刷题五遍还没offer!举例分析为什么找工作光刷题不够 .</p>
<br>
<h2 id="c如何刷遍leetcode">C#如何刷遍LeetCode</h2>
<p>在 LeetCode 中提交 C# 代码有两种主流方式,下面以 LeetCode 中的136号题为例来说明。</p>
<p>该题的中文版网址为: https://leetcode-cn.com/problems/single-number/,将代码语言选为C#,则默认的接口代码如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185054734-1228218740.png" alt="1570093879610" loading="lazy"></p>
<pre><code class="language-cs">public class Solution {
public int SingleNumber(int[] nums) {
}
}
</code></pre>
<h3 id="选项1-vs本地debug--在线验证后提交"><code>选项1</code>: VS本地Debug + 在线验证后提交</h3>
<ul>
<li>在本地Visual Studio中创建 .NET Core/Framework 项目</li>
<li>将所生成项目中的 <code>Program.cs</code>中 <code>class Program</code>改为<code>public class Solution</code></li>
<li>接下来把相应的代码放在类 Solution 里面</li>
</ul>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185125545-1213794430.png" alt="1570098201631" loading="lazy"></p>
<p>如果需要本地测试,只需在该类里面加入<code>主函数</code>即可,然后在<code>主函数</code>中调用相应的函数,debug,观察调用时的各项值。</p>
<p>使用LeetCode的"执行代码"案例可以测试当前的测试用例,而界面上的"测试用例"可以自行修改。</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185146233-977059286.png" alt="1570094316509" loading="lazy"></p>
<p>如果此时对代码比较有信心,可以直接点"Test"按钮左侧的"Submit"按钮提交代码了。</p>
<p>如果不幸,部分Test case无法通过,则可进行本地debug,下面是我给出的样例代码:</p>
<pre><code class="language-cs">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++;
}
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));
}
}
}
</code></pre>
<br>
<h3 id="选项2-vs-code本地debug--在-leetcode-插件中验证和提交"><code>选项2</code>: VS Code本地Debug + 在 LeetCode 插件中验证和提交</h3>
<br>
<h4 id="安装c相关插件">安装C#相关插件</h4>
<p>首先微软官方 OmniSharp 团队开发的 C# 插件是必须安装的,</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185204140-1939225009.png" alt="1570080035282" loading="lazy"></p>
<br>
<h4 id="配置-net-core运行环境">配置 .NET Core运行环境</h4>
<p>先安装 .NET Core SDK 3.0,到官网 https://dotnet.microsoft.com/download 下载安装即可。</p>
<p>首先在 VS Code下方的Terminal窗口中依次输入如下命令:</p>
<pre><code class="language-bash">$ dotnet --version
3.0.100-preview5-011362
$ cd d:/Coding/csLeetcode
$ dotnet new console -o "leetcoce136"
</code></pre>
<p>这里假设你以及有文件夹<code>d:/Coding/csLeetcode</code>.</p>
<br>
<h4 id="在vs-code中debug-c">在VS Code中Debug <code>C#</code></h4>
<p>这里我们直接使用刚才带主函数的本地测试代码吧,将代码先拿过来,然后按<code>F5</code>,选择 <code>.NET Core</code>,具体操作见下图:</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185321422-1666982558.gif" alt="vs code-config-C#-part1" loading="lazy"></p>
<p>在配置文件<code>launch.json</code>中,我们需要选择类型的是 <code>.NET: Launch .NET Core Console App</code>.<br>
<img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003191449790-2037062421.png" alt="consoleApp" loading="lazy"></p>
<br>
<p><code>launch.json</code>的完整配置过程如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185334914-876287875.gif" alt="vs code-config-C#" loading="lazy"></p>
<p>接下来我们需要修改其中的属性值 <code>program</code>:</p>
<p>默认的值为 <code>"program": "${workspaceFolder}/bin/Debug/<target-framework>/<project-name.dll>"</code></p>
<p>其中的<code><target-framework></code>是指目标运行环境,其具体版本可以在上面还原的项目文件<code>leetcoce136.csproj</code>中看到:</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185402380-1815109968.png" alt="1570082207458" loading="lazy"></p>
<p>而我们的项目名,即<code>project-name</code>是<code>leetcode136</code>,于是<code>program</code>的具体值为:</p>
<p><code>"${workspaceFolder}/bin/Debug/netcoreapp3.0/leetcode136.dll"</code></p>
<br>
<h4 id="安装-leetcode-插件">安装 LeetCode 插件</h4>
<p>在扩展中搜索安装作者是 <code>ShengChen</code>的<code>LeetCode</code>插件。</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185425177-1400657539.png" alt="1570080114130" loading="lazy"></p>
<p>然后点击左下角的LeetCode Logo进行登录:</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185444992-471884887.png" alt="1570096594305" loading="lazy"></p>
<p>推荐选择<code>力扣leetcode-cn.com</code>:</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185502211-1567844495.png" alt="1570096683855" loading="lazy"></p>
<p>在国内使用,网络相对稳定。</p>
<p>然后在 LeetCode 插件的配置文档中将<code>leetcode.defaultLanguage</code>设置为<code>csharp</code>。</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185524099-605721022.png" alt="img" loading="lazy"></p>
<p>其完整操作过程如下:<br>
<img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003213942318-328984521.gif" alt="vs code-leetcode-config" loading="lazy"></p>
<p>接下来就可以愉快地使用LeetCode刷题了。</p>
<br>
<p>我们在左侧题库列表中选择<code>All</code>,找到刚才的例子No.136,双击问题标题,可以看到问题描述:</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185544869-756635850.png" alt="1570096852553" loading="lazy"></p>
<p>如果需要提交代码,只需点右下角的"Code Now"按钮。</p>
<p>当我们写完代码后,可以点击里面的代码下方的<code>Test</code>进行测试,这便等价于网页版的按钮"执行代码"。</p>
<p><img src="https://img2018.cnblogs.com/blog/436938/201910/436938-20191003185603583-1061093872.png" alt="1570097362418" loading="lazy"></p>
<p>点<code>Test</code>后有图中3种选项,我一般是使用第一个。除非部分 Test Case 无法通过,才会使用第2个或第3个选项。</p>
<p>此时呢,如果对代码比较有信心,可以直接点"Test"按钮左侧的"Submit"按钮提交代码了。</p>
<p>关于VS Code的LeetCode 插件,文章 LeetCode for VS Code: 春招 Offer 收割利器 中有更详细的说明。</p>
<p>接下来的 <strong>LeetCode面试题系列连载</strong> 中每篇文章将会提供解题思路、算法复杂度的简要分析、已AC代码、提交的答案排名等,敬请期待。</p>
<br>
<p><strong>参考资料:</strong></p>
<p>.NET Core and Visual Studio Code<br>
https://code.visualstudio.com/docs/languages/dotnet</p>
<p>使用VS Code 开发.NET CORE 程序指南<br>
https://www.cnblogs.com/xboo/p/11431222.html</p>
<br>
<hr>
<p><strong>作者简介</strong>:Bravo Yeung,计算机硕士,知乎干货答主(获<strong>81K</strong> 赞同, <strong>38K</strong> 感谢, <strong>235K</strong> 收藏)。曾在国内 Top3互联网视频直播公司工作过,后加入一家外企做软件开发至今。</p>
<br>
<p>如需转载,请加微信 <strong>iMath7</strong> 申请开白!</p>
<br>
<p>欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。</p>
<br>
<p>欢迎各位读者加入 <strong>.NET技术交流群</strong>,在公众号后台回复<strong>“加群”</strong>或者<strong>“学习”</strong>即可。</p>
<br>
<p><img src="https://images.cnblogs.com/cnblogs_com/enjoy233/1389971/o_gzhCard_for_blog.png" alt="大白技术控 公众号名片" loading="lazy"></p>
<h3 id="文末彩蛋">文末彩蛋</h3>
<blockquote>
<p>微信后台回复“<strong>asp</strong>”,给你:一份全网最强的ASP.NET学习路线图。<br>
<br><br>
回复“<strong>cs</strong>”,给你:一整套 C# 和 WPF 学习资源!<br>
<br><br>
回复“<strong>core</strong>”,给你:2019年dotConf大会上发布的.NET core 3.0学习视频!</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/enjoy233/p/csharp_leetcode_series_1.html
頁:
[1]