我从大厂面试中学到的关于 C# 的知识

我从工作面试中学到的关于 C# 的知识

原文链接:https://michaelscodingspot.com/what-i-learned-about-c-from-job-interviews/

作者:Michael Shpilt

我最近参加了一些最大的科技公司的一系列工作面试。在没有透露姓名的情况下,我得到了世界排名前 5 的科技公司中的 3 家的面试机会。你知道我在说谁。

这些公司的面试流程大不相同,但也有很多共同点,包括对编码问题的高度重视。这些问题可能是对某些东西进行排序,打印所有可能的组合,或者找到走出迷宫的路。我不确定解决这些问题与实际软件开发有何关系,但这些公司似乎确实这么认为。我不记得在我的日常工作中必须实现排序算法。或者反转链表。或者在图形上使用 DFS。尽管如此,您仍然可以证明能够解决这些问题的开发人员在现实生活中会更好。

但这篇文章不是关于这些问题的动机。这篇文章是关于我从求职面试中学到的关于 C# 的知识。具体来说,从编码问题。我已经使用 C# 进行专业编程 10 多年了,但正如我发现的那样,开发软件与通过面试完全不同。

顺便说一下,所有大公司(译者注:仅限于西雅图)都允许候选人用任何编程语言解决问题。因此,即使该职位是针对 JavaScript 的,您仍然可以编写 C# 代码。

多维数组

我认为我在工作中从未使用过多维数组。当然,我有时会使用一个列表列表List<List<T>>,可能还会使用一个数组列表List<int[]>,以及偶尔使用数组字典列表List<Dictionary<int, string[]>>(这个不常用)。没有那么多多维数组。但我发现它们在编码练习中非常有用。

多维数组与数组数组不同,例如int[][] arr(锯齿状数组)。后者是一组数组,其中每个数组的长度可以不同。而多维数组更适合常见问题,例如表示 2D 迷宫或 3D 立方体。如果您很快就要参加工作面试,请更新这些语法。这包括初始值设定项、维度长度和列/行各自的索引。

int[,] arr = new int[3, 2]{{1, 2},{3, 4},{5, 6}};int firstDimensionLength = arr.GetLength(0);//3
int secondDimensionLength = arr.GetLength(1);//2
var p00 = arr[0, 0];//1
var p01 = arr[0, 1];//2
var p10 = arr[1, 0];//3

这是一个多维数组派上用场的问题示例:

给定一个由 MxN 方形单元组成的二维空间,其中每个单元要么是一个自由空间,要么是一面墙,找到自由空间的最大连通区域并返回其单元数。

使用元组,而不是类

我已经用 C# 编程一段时间了,我很少使用元组。可能是因为我不习惯ValueTuple. 我的默认选择通常是一个类。对于类有一些好处:它们使代码更加结构化并且可以说更具可读性。但是元组实际上有一个非常好的语法。也许,更重要的是,它们具有更

紧凑的

语法。只是少写了。如果你想改变一些东西,那就没有什么可改变的了。这些事情在编码面试中非常重要。您希望花费最少的时间输入代码,以便有更多的时间思考。并可能回答更多问题。

这是一个例子。假设我有一个方法可以返回 3D 数组中的一个点,当我使用一个类时,我会这样写:

class Point3D
{public int X { get; set; }public int Y { get; set; }public int Z { get; set; }
}private Point3D Calc(){ ... }

而对于元组,它是:

private (int X, int Y, int Z) Calc(){ ... }

请记住,在编码面试中,您将在一种类似于在线记事本的环境中进行写作,在那里您没有代码片段、自动完成功能以及您习惯于从 Visual Studio 使用的所有其他优点。

二元运算也是一回事

您在库和应用程序中使用<<>>&|运算符的频率如何?我猜没有那么多。我也没有,但它们在编码问题中很有用。这里有一个小提醒:

int a = 15;
Console.WriteLine(Convert.ToString(a, toBase: 2));//1111
a = a >> 2;//shift right twice (same as divide by 4)
Console.WriteLine(Convert.ToString(a, toBase: 2));//11
a = a << 3;//shift left 3 times (same as multiply by 8)
Console.WriteLine(Convert.ToString(a, toBase: 2));//11000
a = a & 0b_11111; // stays same
Console.WriteLine(Convert.ToString(a, toBase: 2));//11000
a = a & 0b_1111; // remains 1000 because leftmost digit is nullified
Console.WriteLine(Convert.ToString(a, toBase: 2));//1000
a = a | 0b_1; // becomes 1001
Console.WriteLine(Convert.ToString(a, toBase: 2));//1001
a = a | 0b_110; // becomes 1111
Console.WriteLine(Convert.ToString(a, toBase: 2));//111

关于二进制的一件事是,以基数 2 进行迭代可能有助于解决置换问题。例如,考虑以下问题:

给定一组项目,打印出这些项目的所有可能组合,其中每个项目可能包含或不包含。顺序无关紧要。

因此对于输入 [“a”,”b”,”c”],输出将是:

[empty array], a, b, c, ab, ac, bc, abc

现在考虑从 0 到 2^3 的二进制迭代。如果每个数字都描述了结果中是否包含数组的一个项目,那么这是打印出所有可能迭代的一种方法。上面的结果可以描述为:

1
2
000, 001, 010, 100, 110, 101, 011, 111

不要只依赖二元运算符。解决这个置换问题的另一种方法是使用简单的递归。

字符串和数组的有用内容

编码问题中使用的大多数方法与现实生活中使用的方法相同。对于字符串,它是您的.Substring.Contains.Replacestring.Equals().ToLower().ToUpper(), 等。我发现在这些问题中非常有用的一种方法是string.Join. 它将加入一个字符串集合,每对字符串之间有一个分隔符。例如:

var joined = string.Join(",", new[] { "a", "b", "c" }); // "a,b,c"

对于数组,我还发现了一些有用的方法。其中之一是Array.Sort,它可以接受Comparison<T>委托来根据您的需要进行排序。假设您想根据最后一个字母对一堆字符串进行排序。这很简单:

var words = new[] { "cat", "job", "zebra", "row" };
Array.Sort(words, (w1, w2) =>
{var lastLetter1 = w1[w1.Length - 1];var lastLetter2 = w2[w2.Length - 1];return lastLetter1 < lastLetter2 ? -1 : 1;// or: return lastLetter1.CompareTo(lastLetter2);
});
var joined = string.Join(',', words); // zebra,job,cat,row

我以前从未真正使用过的另一个有用的方法是Array.Copy. 除此之外,它还可以将数组的切片复制到新数组中。例如:

var words = new[] { "cat", "job", "zebra", "row" };
string[] dest = new string[2];
Array.Copy(words, sourceIndex:1, dest, destinationIndex: 0, length: 2);
Console.WriteLine(string.Join(',', dest)); // job, zebra

还有其他方法可以复制数组切片。其中之一是使用 LINQ: words.Skip(1).Take(2).ToArray()。但我不确定我是否会在与 Java 程序员的面试中展示我的 ninja C# 技能。

Python有时更简短

关于 C# 有很多好话要说,但它可能不是算法的最佳语言。我的意思是,Python 中的相同解决方案会更短,而且我敢说更干净。如果您有疑问,请访问leetcode.com[1]或任何其他类似站点,并浏览解决方案。尝试比较 C# 和 Python 中同一问题的解决方案。Python 的看起来不是更……漂亮吗?再说一次,也许是因为栅栏另一边的草总是很茂盛。

我学到的与 C# 无关的东西

你可以从求职面试中学到很多东西。既是面试官,又是被面试者。我在整个过程中学到的最重要的东西与 C# 或任何其他语言无关。由于这篇文章是关于编码挑战的,我将坚持我从这些方面学到的东西。以下是我学到的一些技巧和窍门,可以帮助我解决编码问题:

熟能生巧

面试的准备是一切的不同之处。是的,这需要很多时间,但考虑到风险,这是非常值得的。从严格的财务角度来看,在薪水高、资历高的公司工作,是您一生中最重要的财务改善之一。花几天或几周的时间为它们做准备绝对值得。

对于编码问题,我使用了leetcode.com[2],这是解决此类[3]问题的最佳网站之一。我建议从简单的问题开始,花最多的时间在中等,并尝试一些困难的问题。该站点的最佳功能之一是您可以在每个问题的讨论部分看到其他提交的内容。该网站非常受欢迎,所以总是有各种语言的提交。我建议您先尝试自己解决问题,然后再查看其他提交的内容(即使您成功了)。我当然从中学到了很多。

大多数问题都很简单

如果您浏览leetcode.com 之[4]类的网站[5],您可能会认为 Facebook 或 Apple 等顶级公司会问您非常棘手的[6]问题。根据我的经验,这不是真的。大多数问题都在中等难度范围内。不太容易,但也不难,绝对不难。许多问题都是递归 DFS 或 BFS 的经典实现。或者Bin 装箱问题[7]的变体。有时您需要遍历二叉树。在极少数情况下,您可能需要使用堆。

但是你也可能在简单和中等的问题上失败。相信我,我知道。面试压力很大。您必须非常迅速地提出解决方案。有时面试官会把你引向错误的方向(无论是有意还是无意)。其他时候,您可能会记住某些事情或分心,这会使您偏离正确(且简单)的解决方案。

我学会了始终牢记这个问题可能并不棘手,但很容易。这大多是真实的,思考可以减轻一些压力。

写之前想一想

在实际编写解决方案之前,请多想一想。它是最优化的吗?你能达到更好的时间复杂度吗?代码是否会简短易懂?问问自己是否可以改进解决方案。

通常,面试官会在实际编写之前要求您描述您的解决方案。这对你来说很棒。即使他们不问,我也建议你自己解释一下。解释完之后,写代码就容易多了。此外,您经常会在解决方案中发现一些问题。这也是与面试官建立联系的好机会。你可以向他们展示你的思维过程,证明你是一个聪明的人,很容易相处。

使用简称

在软件开发中,我们非常习惯于描述性的名称。所以我会有一个方法GetAddressandCalculateFastestRoute而不是Getand Calc。在编码问题中,恰恰相反的是要走的路。至少这对我有用。坚持为变量名称和方法使用短名称。如果你觉得你的面试官是一个固执的人,你可以在你的解决方案奏效后给他们重命名,或者只是提到你在这次面试中使用了简称,而不是常规。

我不是说要命名您的方法AB. 但我是说,如果您的问题是遍历迷宫,并且您使用的是深度优先搜索算法,请随意命名该方法DFS而不是FindAWayInAMaze.

总结

一家大企业面试是一种迷人的经历。这与为初创公司甚至大型科技公司接受面试完全不同。公司之间的面试有很大的不同,你可以了解一些公司文化。

我在这里谈到了编码问题,但这只是面试的一部分。大多数公司也有某种“系统设计”面试,你必须架构一个大型(通常是分布式)系统。面试过程的另一部分是关于你在组织中的行为、态度和行为。


你是团队成员吗?您是否总是为客户着想?你能独立工作吗?这些可能与技术问题一样重要。

References

[1] leetcode.com: https://leetcode.com/
[2] leetcode.com: https://leetcode.com/
[3] 此类: https://leetcode.com/
[4] leetcode.com 之: https://leetcode.com/
[5] 网站: https://leetcode.com/
[6] 棘手的: https://leetcode.com/
[7] Bin 装箱问题: https://en.wikipedia.org/wiki/Bin_packing_problem

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

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

相关文章

深入浅出自定义标签(二)生成javascript

自从写了深入浅出自定义标签(一)入门之后一直没有得出时间继续写,正好这次项目中用到"自定义标签",这次的用途是通过Session中的存储的相关功能点的List,进行迭代生成javascript脚本,在前台通过javascript生成树桩结构所有的页面元素都是Html,包括javascript所以生成…

曾凭一己之力推动物理学发展,是清华大学最年轻教授,世界却欠他一个诺贝尔奖!...

全世界只有3.14 %的人关注了青少年数学之旅说起中国最牛的科学家&#xff0c;大家可能都会想起钱学森。钱学森被美国称为“一个人抵五个师”并阻止他回国的故事&#xff0c;几乎家喻户晓。钱学森但事实上&#xff0c;在中国近代&#xff0c;也有一个科学大牛&#xff0c;曾被美…

SharpDeveloeper开发ASP.NET MVC汗流浃背

今天好不容易休息了一天&#xff0c;上网狂了一圈&#xff0c;突然想起了以前的一个轻量级的开发工具“SharpDeveloper”&#xff0c;于是就下载试着来开发一下ASP.NET&#xff0c;但是老魏没有想到的是&#xff0c;虽然官方提供了对ASP.NET MVC的支持&#xff0c;但是实际开发…

Vue 2升级 Vue 3初探小细节

【导读】嗯&#xff0c;偶尔看看学习Vue 3技能啦&#xff0c;此前用过Vue 2做过一点东西&#xff0c;Vue 3已面世一段时间&#xff0c;于是乎&#xff0c;我来看看所遇到的问题是否在Vue 3中得到解决首先&#xff0c;我们来讲讲一个例子在Vue 2中的实现&#xff0c;举个栗子吧&…

计算机竞赛游戏探险岛,冒险岛2五大全新团本综合分析

随着新版本的到来&#xff0c;这次推出了两个混沌团本&#xff0c;分别是影子军团祭坛、月光船长要塞。三个10人新团本&#xff0c;分别是迷宫集会堂、路贝里斯克、不灭神殿。混沌团本可以掉落橙装&#xff0c;新团本则可以掉落专属武器。影子军团祭坛是我们的两大混沌本之一&a…

薛定谔的猫——.NET 4.1 中的新基类,开源Preview中

前言&#xff1a; 昨天一如既往地登上forums.asp.net答帖子&#xff0c;却被上面的一条滚动新闻雷到了&#xff1a; .NET 4.1 Preview - New Base Class Library (BCL) Extension Methods - RFC 因为考虑到April 1st的关系&#xff0c;这是Scott Hanselman给大家开的玩笑&…

史上最硬核文科生,擅长解决数学难题,却视考试成为终生噩梦

全世界只有3.14 %的人关注了青少年数学之旅“数学存在的价值&#xff0c;不只是为了生活上的应用&#xff0c;它不应沦为供工程、商业应用的工具&#xff0c;数学的突破仍需要不断地去突破现有格局。”——节选自《数学之旅 闪耀人类的54个数学家》他是一位浪漫的法国人&#…

胡晓曼:MindSpore 开源运营与治理 | DEV. Together 2021 中国开发者生态峰会

内容来源&#xff1a;2021 年 6 月 5 日&#xff0c;由 SegmentFault 思否主办的 2021 中国开发者生态峰会圆满落幕。会上&#xff0c;华为 MindSpore 运营总监胡晓曼发表了主题为《MindSpore 开源运营与治理》的演讲。分享嘉宾&#xff1a;胡晓曼&#xff0c;华为 MindSpore 运…

C# 语言特性

Codeusing System;using System.Collections.Generic;using System.Text;namespace InterfaceShadow{ interface ISomeInterface { void DoSomething(); } class Class1 : ISomeInterface { #region ISomeInterface 成员 public void DoSo…

如何掌握C#的核心技术

如何掌握C#的核心技术原图来自网络&#xff0c;如有侵权&#xff0c;请联系小编删除。引子前不久看到一个段子&#xff0c;某年宁波交警引进人脸识别技术抓拍行人闯红灯&#xff0c;结果一天下来被发现闯红灯次数最多的是珠海女子董小姐&#xff0c;日闯红灯3000多次。宁波交警…

怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。

全世界只有3.14 %的人关注了青少年数学之旅提到乔布斯&#xff0c;大家会想到什么呢&#xff1f;苹果公司创始人&#xff1f;iPhone手机&#xff1f;iPad?人生赢家&#xff1f;不过大家肯定没有想到乔布斯也有吃瘪的时候&#xff1a;有一次&#xff0c;乔布斯对电动平衡车赛格…

祝贺|合肥.NET俱乐部第二期技术沙龙活动圆满成功

热烈祝贺合肥.NET俱乐部第二期技术沙龙圆满成功&#xff0c;感恩参与活动的每一位小伙伴&#xff01;正是因为有你们才促成了这次聚会的成功。现对此次活动进行简单回顾并附上精彩的活动图片&#xff0c;每一位参与活动者名单&#xff0c;以及此次活动讲师分享的PPT供大家学习下…

几个常用的JS代码.

//函数列表function PostCookie(cookieName) { var expdate new Date(); expdate.setTime(expdate.getTime() 604800000); document.cookiecookieName";expires"expdate.toGMTString()";path /;domain.52z.com"; }//用于产生随机轮转广告 i 随机个…

SQL中合并多行记录的方法总汇

SQL中合并多行记录的方法总汇——前几天还在抱怨&#xff1a;sql只有sum(数值)&#xff0c;不能sum(字符串)——如果不是分组统计&#xff0c;用select values values , value也是可以的——但是如果是分组sum(字符串)&#xff0c;肯定不行了&#xff01;——下面是用函数实…

Python中文编码判别及转换

为什么80%的码农都做不了架构师&#xff1f;>>> 养成使用utf8格式的习惯&#xff0c;但是不能保证所有的代码都是utf8格式&#xff0c;所以这里提供三个函数 getCoding tran2UTF8 tran2GBK &#xff0c;分别是查看编码格式&#xff0c;转换为utf8&#xff0c;gbk格…

计算机二级中制作流程图的视频教程,流程图怎么做?1分钟教会你流程图制作方法...

流程是指在特定情景下用一系列逻辑满足特定用户需求的一种总结&#xff0c;借助流程图不仅可以梳理产品需求背后的逻辑和流程&#xff0c;还可以将新的想法和概念借助流程图这个载体分享出来&#xff0c;让整个项目参与者更好的认知产品设计的思路和逻辑。为了让职场的你更好的…

Source Generators实现简版AutoMapper

问题在业务开发中&#xff0c;我们常常需要将一个对象映射成另一个对象。例如将领域实体(UserEntity)映射成暴露给服务外部使用的数据传输对象(UserDto)。而AutoMapper则是目前主流的解决方案&#xff0c;实现类似如下代码&#xff1a;var configuration new MapperConfigurat…

15岁大学毕业,一生800多篇专著论文,双眼失明却凭一条公式称霸数学界

全世界只有3.14 %的人关注了青少年数学之旅从文明之火初燃的那一刻起数学就与之为伴从万年前“数”的产生到现代科技的迅猛发展数学不仅是窥探宇宙万物的入口也是最高智慧的结晶在漫漫的人类历史长河中各个伟大的数学家犹如布满“数学星空”中的星群他们追求最高的精确最合理的…

Java程序员应该知道的10个Eclipse调试技巧

为什么80%的码农都做不了架构师&#xff1f;>>> Eclipse是众多Java程序员实用的开发工具&#xff0c;其中开发技巧也是繁多&#xff0c;但作为优秀的Java程序员&#xff0c;需要掌握最起码的调试技巧。 1 条件断点 2 异常断点 3 监视点 4 评估/检查 5 修改变量值 6…

.NET 平台采用率的提升归功于开源

微软近日发布了一篇博客&#xff0c;以对话形式与 .NET 工程师探讨了一下有关 .NET 项目的开源经验和心得。其中指出&#xff0c;.NET 软件开发平台采用率的提升主要归功于开源。根据介绍&#xff0c;微软在 2015 年将其 CoreCLR .NET 执行引擎作为开源发布&#xff0c;并在 20…