C#刷遍Leetcode面试题系列连载(1) - 入门与工具简介

点击蓝字“dotNET匠人”关注我哟

加个“星标”,每日 7:15,好文必达!

640?

什么要刷LeetCode

大家都知道,很多对算法要求高一点的软件公司,比如美国的FLAGM (Facebook、LinkedIn、Amazon/Apple、Google、Microsoft),或国内大厂BAT、TMD、华为,以及国内新兴的 AI 公司等等,都对算法水平有所要求。据悉知名游戏公司的算法岗收入很高,相应的对算法要求也比较高。而这些公司,大多数会以 LeetCode 中的题目或基于 LeetCode 改进后的自家算法题库来考察候选人。

于是想进入上述大厂,定期做 LeetCode 题目很有必要。即使没打算进这些大厂,坚持做LeetCode,个人的算法水平、编程能力也会有较大提升。本文主要介绍 .NET 开发者如何入手刷 LeetCode 面试题。

640?wx_fmt=png

刷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#,则默认的接口代码如下:

640?wx_fmt=png

public class Solution {	public int SingleNumber(int[] nums) {	}	
}


选项1:VS本地Debug + 在线验证后提交

  • 在本地Visual Studio中创建 .NET Core/Framework 项目

  • 将所生成项目中的 Program.cs中 classProgram改为 publicclassSolution

  • 接下来把相应的代码放在类 Solution 里面

640?wx_fmt=png

如果需要本地测试,只需在该类里面加入 主函数即可,然后在 主函数中调用相应的函数,debug,观察调用时的各项值。

使用LeetCode的"执行代码"案例可以测试当前的测试用例,而界面上的"测试用例"可以自行修改。

640?wx_fmt=png

如果此时对代码比较有信心,可以直接点"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# 插件是必须安装的,

640?wx_fmt=png

另外再安装一下第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,具体操作见下图:

640?wx_fmt=gif

在配置文件 launch.json中,我们需要选择类型的是 .NET:Launch.NETCoreConsoleApp.640?wx_fmt=png

launch.json的完整配置过程如下:

640?wx_fmt=gif

接下来我们需要修改其中的属性值 program

默认的值为:

"program":"${workspaceFolder}/bin/Debug/<target-framework>/<project-name.dll>"

其中的 <target-framework>是指目标运行环境,其具体版本可以在上面还原的项目文件 leetcoce136.csproj 中看到:

640?wx_fmt=png

而我们的项目名,即 project-nameleetcode136,于是 program的具体值为:

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

安装 LeetCode 插件

在扩展中搜索安装作者是 ShengChenLeetCode插件。

640?wx_fmt=png

然后点击左下角的LeetCode Logo进行登录:

640?wx_fmt=png

推荐选择 力扣leetcode-cn.com:

640?wx_fmt=png

在国内使用,网络相对稳定。

然后在 LeetCode 插件的配置文档中将 leetcode.defaultLanguage设置为 csharp

640?wx_fmt=png

其完整操作过程如下:

640?wx_fmt=gif

接下来就可以愉快地使用LeetCode刷题了。

我们在左侧题库列表中选择 All,找到刚才的例子No.136,双击问题标题,可以看到问题描述:

640?wx_fmt=png

如果需要提交代码,只需点右下角的"Code Now"按钮。

当我们写完代码后,可以点击里面的代码下方的 Test 按钮进行测试,这便等价于网页版的按钮"执行代码"。

640?wx_fmt=png

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

End


作者简介:Bravo Yeung计算机硕士,知乎干货答主(获73K 赞同, 34K 感谢, 210K 收藏)。曾在国内 Top3互联网视频直播公司短暂工作过,后加入一家外企做软件开发至今。

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入 .NET技术交流群,在公众号后台回复“加群”或者“学习”即可。



640?wx_fmt=jpeg



smiley_66.png你点的每一个"在看"

我都当成了喜欢!

640?wx_fmt=gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core迁移前的准备工作

前段时间迁移.NET Core做了大量的试水和评估&#xff0c;今天整理一下分享给大家。大致有以下几个部分&#xff1a;1. .NET Core的由来2. 为什么要迁移.NET Core3. .NET Core3.X主要特性4. .NET Standard和.NET Core5. .NET Core Roadmap&版本选择接下来&#xff0c;我们详…

二叉排序树或二叉搜索树

一、二叉树基础 1.1 二叉排序树定义 二叉排序树&#xff08;Binary Sort Tree&#xff09;又称二叉查找(搜索)树&#xff08;Binary Search Tree&#xff09;。它是一颗空树&#xff0c;或者具有下列性质&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有结点的值…

沈向洋对于工程技术人员的十点经验分享

沈向洋目前是微软的执行副总裁&#xff0c;人工智能与研究部门的最高负责人。他是计算机视觉和图形学研究的世界级专家&#xff0c;是美国电气电子工程协会院士&#xff08;IEEE Fellow&#xff09;及是国际计算机协会院士&#xff08;ACM Fellow&#xff09;&#xff0c;曾任国…

.Net Core中间件和过滤器实现错误日志记录

1.中间件的概念ASP.NET Core的处理流程是一个管道&#xff0c;中间件是组装到应用程序管道中用来处理请求和响应的组件。每个中间件可以&#xff1a;选择是否将请求传递给管道中的下一个组件。可以在调用管道中的下一个组件之前和之后执行业务逻辑。中间件是一个请求委托&#…

最大堆、最小堆Java实现,解决TOP K问题

一、基础知识 1.1 什么是最大&#xff08;小&#xff09;堆 最大堆&#xff0c;最小堆类似&#xff0c;以下以最小堆为例进行讲解。 最小堆是满足以下条件的数据结构&#xff1a; 它是一棵完全二叉树所有父节点的值小于或等于两个子节点的值 1.2 什么是完全二叉树 除了最后…

使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群

在《容器化单页面应用中RESTful API的访问》以及《容器化单页面应用中Nginx反向代理与Kubernetes部署》两篇文章中&#xff0c;我介绍了一套容器化ASP.NET Core应用程序的方案&#xff0c;并对于Nginx反向代理的使用进行了介绍。在《使用Rancher在Microsoft Azure上搭建Kuberne…

微软如何利用机器学习改进Win 10更新体验

微软在 2018 年 4 月 Windows 更新时第一次大规模使用机器学习&#xff08;ML&#xff09;&#xff0c;ML 通过监测 PC 运行状况的六个核心领域&#xff08;例如总体可靠性&#xff09;&#xff0c;以确定功能更新过程是否顺利进行。而在 2019 年 5 月发布的更新推送中&#xf…

使用.NET Core创建Windows服务(一) - 使用官方推荐方式

原文&#xff1a;Creating Windows Services In .NET Core – Part 1 – The “Microsoft” Way创建Windows服务来运行批处理任务或者运行后台任务&#xff0c;是一种非常常见的模式&#xff0c;但是由于云服务&#xff08;Amazon Lambda, Azure WebJobs以及Azure Functions&am…

关于.NET HttpClient方式获取微信小程序码(二维码

随着微信小程序的火热应用&#xff0c;市面上有关小程序开发的需求也多了起来。近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面&#xff08;带参数&#xff09;&#xff1b;看了下小程序官方文档&#xff0c;以及网上的例子&#xff0c;未看到…

从零开始使用Skywalking分布式链路追踪系统

当我们用很多服务时&#xff0c;各个服务间的调用关系是怎么样的&#xff1f;各个服务单调用的顺序\时间性能怎么样?服务出错了&#xff0c;到底是哪个服务引起的&#xff1f;这些问题我们用什么方案解决呢&#xff0c;以前的方式是各个系统自己单独做日志&#xff0c;出了问题…

快速排序 (Quick Sort)(Java实现)

快速排序&#xff08;Quicksort&#xff09;是对冒泡排序的一种改进&#xff0c;借用了分治的思想&#xff0c;由C. A. R. Hoare在1962年提出。 1、基本思想 快速排序的基本思想&#xff1a;挖坑填数分治法。 首先选一个轴值(pivot&#xff0c;也有叫基准的)&#xff0c;通过…

使用.net core3.0 正式版创建Winform程序

前阵子一直期待.net core3.0正式版本的出来&#xff0c;以为这个版本出来&#xff0c;Winform程序又迎来一次新生了&#xff0c;不过9.23日出来的马上下载更新VS&#xff0c;创建新的.net core Winform项目&#xff0c;发现并没有Winform窗体设计器。而微软目前则是通过插件的方…

深入理解 ValueTask

.NET Framework 4 里面的命名空间为 System.Threading.Tasks的 Task 类。这个类以及它派生的 Task<TResult> 早已成为编程的主要部分&#xff0c;在 C#5 中的异步编程模式当作介绍了 async/await。在这篇文章里&#xff0c;我会覆盖新的类 ValueTask / ValueTask<TRes…

NET Core 3.0 AutoFac替换内置DI的新姿势

.NET Core 3.0 和 以往版本不同&#xff0c;替换AutoFac服务的方式有了一定的变化&#xff0c;在尝试着升级项目的时候出现了一些问题。原来在NET Core 2.1时候&#xff0c;AutoFac返回一个 IServiceProvider 参数注入到ConfigureServices .NET Core 服务中&#xff0c;基本大痣…

asp.net core 使用Mysql和Dapper

序曲&#xff1a;学习编程最好的方式就是敲代码&#xff0c;没有比这个更好的方法&#xff0c;哪怕你看了上百G的视频&#xff0c;都不如你自己敲几行代码更为有效。还有要记得敲完代码然后写一篇随笔来记录一下你所学所想。大家都知道&#xff0c;.netcore是微软一个具有历史意…

CSFR(跨站请求伪造)攻击与防御

一、CSRF是什么&#xff1f; CSRF&#xff08;Cross-site request forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求伪造&#xff0c;也被称为&#xff1a;one click attack/session riding&#xff0c;缩写为&#xff1a;CSRF/XSRF。 二、CSRF可以做什么&#…

Vue 3源码公布

10 月 5 日凌晨&#xff0c;Vue.js 框架的作者兼核心开发者尤雨溪公布了尚处于 Pre-Alpha 状态的 Vue 3 源码。说学不动的童鞋抓紧剩余的假期时间撸一遍源码吧 : D作者表示&#xff0c;Vue 3 主要的架构改进、优化和新功能均已完成&#xff0c;剩下的主要任务是完成一些 Vue 2 …

在副业刚需的时代,如何掌握副业的正确姿势?

前言近期&#xff0c;伴随着“副业刚需”这个词语的流行&#xff0c;关于“职场人要不要发展副业”的话题再一次被炒得沸沸扬扬。有人认为副业是刚需&#xff0c;是抵御中年危机的锦囊妙计&#xff0c;甚至是中年人该有的自觉&#xff0c;没有副业的人不足以谈人生&#xff0c;…

使用.NET Core创建Windows服务(二) - 使用Topshelf方式

原文&#xff1a;Creating Windows Services In .NET Core – Part 2 – The “Topshelf” Way作者&#xff1a;Dotnet Core Tutorials译者&#xff1a;Lamond Lu译文&#xff1a;使用.NET Core创建Windows服务&#xff08;二&#xff09; - 使用Topshelf方式使用.NET Core创建…

常用加密算法(Java实现)总结

1、Java的安全体系架构 Java中为安全框架提供类和接口。JDK 安全 API 是 Java 编程语言的核心 API&#xff0c;位于 java.security 包&#xff08;及其子包&#xff09;&#xff0c;以及sun.securityAPI包&#xff08;及其子包&#xff09;中。设计用于帮助开发人员在程序中同…