本文转载自微信公众号《DotNET技术圈》,作者MichaelShpilt。转载本文请联系DotNET技术圈公众号。我最近参加了一些最大的科技公司的一系列工作面试。在匿名的情况下,我采访了世界前5大科技公司中的3家。你知道我在说谁。这些公司的面试过程大不相同,但也有很多共同点,包括非常重视编码问题。这些问题可能是对某些东西进行排序、打印所有可能的组合,或者找到走出迷宫的出路。我不确定解决这些问题与实际软件开发有什么关系,但这些公司似乎是这么认为的。我不记得在我的日常工作中必须实施排序算法。或者反转链表。或者在图上使用DFS。尽管如此,您仍然可以证明能够解决这些问题的开发人员在现实生活中会过得更好。但这篇文章不是关于这些问题的动机。这篇文章是关于我从工作面试中学到的C#知识。具体来说,来自编码问题。我从事C#专业编程已有10多年,但正如我发现的那样,开发软件与通过面试完全不同。顺便说一句,所有大公司(译者注:只在西雅图)都允许应聘者用任何编程语言解决问题。因此,即使工作是针对JavaScript,您仍然可以编写C#代码。多维数组我认为我从未在我的工作中使用过多维数组。当然,我有时会用listoflistsList多维数组不同于数组的数组,比如int[][]arr(锯齿状数组)。后者是一组数组,其中每个数组可以有不同的长度。而多维数组更适合常见问题,例如表示2D迷宫或3D立方体。如果您即将进行工作面试,请更新这些语法。这包括初始值设定项、维度长度和列/行的相应索引。int[,]arr=newint[3,2]{{1,2},{3,4},{5,6}};intfirstDimensionLength=arr.GetLength(0);//3intsecondDimensionLength=arr.GetLength(1);//2varp00=arr[0,0];//1varp01=arr[0,1];//2varp10=arr[1,0];//3这里是多维数组进来的问题示例handy:给定MxN方形单元格的二维空间,其中每个单元格是一个自由空间或一面墙,找到自由空间的最大连接区域并返回其单元格数。使用元组,而不是类我已经用C#编程了一段时间,而且我很少使用元组。可能是因为我不习惯ValueTuple。我的默认选择通常是一个类。类有一些好处:它们使代码更加结构化并且可以说更具可读性。但是元组实际上有一个非常好的语法。也许,更重要的是,它们具有更紧凑的语法。少写点就好了。如果你想改变什么,没有什么可以改变的。这些东西在编码面试中非常重要。你想花最少的时间敲代码,花更多的时间思考。并可能回答更多问题。这是一个例子。假设我有一个返回3D数组中的点的方法,当我使用我编写的类时:classPoint3D{publicintX{get;set;}publicintY{get;set;}publicintZ{get;set;}}privatePoint3DCalc(){...}对于元组,它是:private(intX,intY,intZ)Calc(){...}请记住,在编码面试中,您将做一些类似于在线笔记的事情没有代码片段、自动完成以及您在VisualStudio中习惯的所有其他优点。二元运算也是一回事您多久使用一次<<、>>、&和|?您的库和应用程序中的运算符?我猜没那么多。我也不会,但它们在编码问题中很有用。这里有个小提示:inta=15;Console.WriteLine(Convert.ToString(a,toBase:2));//1111a=a>>2;//shiftrighttwice(sameasdivideby4)Console.WriteLine(Convert.ToString(a,toBase:2));//11a=a<<3;//shiftleft3times(sameasmultiplyby8)Console.WriteLine(Convert.ToString(a,toBase:2));//11000a=a&0b_11111;//保持不变Console.WriteLine(Convert.ToString(a,toBase:2));//11000a=a&0b_1111;//保持1000因为leftmostdigit无效Console.WriteLine(Convert.ToString(a,toBase:2));//1000a=a|0b_1;//变成1001Console.WriteLine(Convert.ToString(a,toBase:2));//1001a=a|0b_110;//变成1111Console.WriteLine(Convert.ToString(a,toBase:2));//111关于二进制的一件事是迭代base2可能有助于解决排列问题。例如,考虑以下问题:给定一组项目,打印出这些项目的所有可能组合,其中可能包含也可能不包含每个项目。顺序无关紧要。所以对于输入["a","b","c"],输出将是:[emptyarray],a,b,c,ab,ac,bc,abc现在考虑从0到2^3的二进制迭代。如果每个数字都描述结果中是否包含数组的一项,那么这里有一种打印出所有可能迭代的方法。上面的结果可以描述为:12000,001,010,100,110,101,011,111不要只依赖二元运算符。解决此排列问题的另一种方法是使用简单递归。字符串和数组的有用内容编码问题中使用的大多数方法与现实生活中使用的方法相同。对于字符串,它是您的.Substring、.Contains、.Replace、string.Equals()、.ToLower()、.ToUpper()等。我发现在这些问题中非常有用的一种方法是string.Join。它将连接一组字符串,每对字符串之间有一个分隔符。例如:varjoined=string.Join(",",new[]{"a","b","c"});//"a,b,c"对于数组,我也发现了一些有用的方法。其中之一是Array.Sort,它可以接受一个比较委托来根据您的需要进行排序。假设您想根据最后一个字母对一堆字符串进行排序。这很简单:varwords=new[]{"cat","job","zebra","row"};Array.Sort(words,(w1,w2)=>{varlastLetter1=w1[w1.Length-1];varlastLetter2=w2[w2.Length-1];returnlastLetter1
