自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我從大廠面試中學(xué)到的關(guān)于 C# 的知識

開發(fā) 后端
我最近參加了一些最大的科技公司的一系列工作面試。在沒有透露姓名的情況下,我得到了世界排名前 5 的科技公司中的 3 家的面試機會。你知道我在說誰。

[[412977]]

本文轉(zhuǎn)載自微信公眾號「DotNET技術(shù)圈」,作者M(jìn)ichael Shpilt。轉(zhuǎn)載本文請聯(lián)系DotNET技術(shù)圈公眾號。

我最近參加了一些最大的科技公司的一系列工作面試。在沒有透露姓名的情況下,我得到了世界排名前 5 的科技公司中的 3 家的面試機會。你知道我在說誰。

這些公司的面試流程大不相同,但也有很多共同點,包括對編碼問題的高度重視。這些問題可能是對某些東西進(jìn)行排序,打印所有可能的組合,或者找到走出迷宮的路。我不確定解決這些問題與實際軟件開發(fā)有何關(guān)系,但這些公司似乎確實這么認(rèn)為。我不記得在我的日常工作中必須實現(xiàn)排序算法?;蛘叻崔D(zhuǎn)鏈表?;蛘咴趫D形上使用 DFS。盡管如此,您仍然可以證明能夠解決這些問題的開發(fā)人員在現(xiàn)實生活中會更好。

但這篇文章不是關(guān)于這些問題的動機。這篇文章是關(guān)于我從求職面試中學(xué)到的關(guān)于 C# 的知識。具體來說,從編碼問題。我已經(jīng)使用 C# 進(jìn)行專業(yè)編程 10 多年了,但正如我發(fā)現(xiàn)的那樣,開發(fā)軟件與通過面試完全不同。

順便說一下,所有大公司(譯者注:僅限于西雅圖)都允許候選人用任何編程語言解決問題。因此,即使該職位是針對 JavaScript 的,您仍然可以編寫 C# 代碼。

多維數(shù)組

我認(rèn)為我在工作中從未使用過多維數(shù)組。當(dāng)然,我有時會使用一個列表列表List

多維數(shù)組與數(shù)組數(shù)組不同,例如int[][] arr(鋸齒狀數(shù)組)。后者是一組數(shù)組,其中每個數(shù)組的長度可以不同。而多維數(shù)組更適合常見問題,例如表示 2D 迷宮或 3D 立方體。如果您很快就要參加工作面試,請更新這些語法。這包括初始值設(shè)定項、維度長度和列/行各自的索引。

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

這是一個多維數(shù)組派上用場的問題示例:

給定一個由 MxN 方形單元組成的二維空間,其中每個單元要么是一個自由空間,要么是一面墻,找到自由空間的最大連通區(qū)域并返回其單元數(shù)。

使用元組,而不是類

我已經(jīng)用 C# 編程一段時間了,我很少使用元組??赡苁且驗槲也涣?xí)慣ValueTuple. 我的默認(rèn)選擇通常是一個類。對于類有一些好處:它們使代碼更加結(jié)構(gòu)化并且可以說更具可讀性。但是元組實際上有一個非常好的語法。也許,更重要的是,它們具有更

緊湊的

語法。只是少寫了。如果你想改變一些東西,那就沒有什么可改變的了。這些事情在編碼面試中非常重要。您希望花費最少的時間輸入代碼,以便有更多的時間思考。并可能回答更多問題。

這是一個例子。假設(shè)我有一個方法可以返回 3D 數(shù)組中的一個點,當(dāng)我使用一個類時,我會這樣寫:

  1. class Point3D 
  2.     public int X { get; set; } 
  3.     public int Y { get; set; } 
  4.     public int Z { get; set; } 
  5.  
  6. private Point3D Calc(){ ... } 

而對于元組,它是:

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

請記住,在編碼面試中,您將在一種類似于在線記事本的環(huán)境中進(jìn)行寫作,在那里您沒有代碼片段、自動完成功能以及您習(xí)慣于從 Visual Studio 使用的所有其他優(yōu)點。

二元運算也是一回事

您在庫和應(yīng)用程序中使用<<、>>、&和|運算符的頻率如何?我猜沒有那么多。我也沒有,但它們在編碼問題中很有用。這里有一個小提醒:

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

關(guān)于二進(jìn)制的一件事是,以基數(shù) 2 進(jìn)行迭代可能有助于解決置換問題。例如,考慮以下問題:

給定一組項目,打印出這些項目的所有可能組合,其中每個項目可能包含或不包含。順序無關(guān)緊要。

因此對于輸入 [“a”,”b”,”c”],輸出將是:

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

現(xiàn)在考慮從 0 到 2^3 的二進(jìn)制迭代。如果每個數(shù)字都描述了結(jié)果中是否包含數(shù)組的一個項目,那么這是打印出所有可能迭代的一種方法。上面的結(jié)果可以描述為:

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

不要只依賴二元運算符。解決這個置換問題的另一種方法是使用簡單的遞歸。

字符串和數(shù)組的有用內(nèi)容

編碼問題中使用的大多數(shù)方法與現(xiàn)實生活中使用的方法相同。對于字符串,它是您的.Substring, .Contains, .Replace, string.Equals(), .ToLower(), .ToUpper(), 等。我發(fā)現(xiàn)在這些問題中非常有用的一種方法是string.Join. 它將加入一個字符串集合,每對字符串之間有一個分隔符。例如:

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

對于數(shù)組,我還發(fā)現(xiàn)了一些有用的方法。其中之一是Array.Sort,它可以接受Comparison委托來根據(jù)您的需要進(jìn)行排序。假設(shè)您想根據(jù)最后一個字母對一堆字符串進(jìn)行排序。這很簡單:

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

我以前從未真正使用過的另一個有用的方法是Array.Copy. 除此之外,它還可以將數(shù)組的切片復(fù)制到新數(shù)組中。例如:

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

還有其他方法可以復(fù)制數(shù)組切片。其中之一是使用 LINQ: words.Skip(1).Take(2).ToArray()。但我不確定我是否會在與 Java 程序員的面試中展示我的 ninja C# 技能。

Python有時更簡短

關(guān)于 C# 有很多好話要說,但它可能不是算法的最佳語言。我的意思是,Python 中的相同解決方案會更短,而且我敢說更干凈。如果您有疑問,請訪問leetcode.com[1]或任何其他類似站點,并瀏覽解決方案。嘗試比較 C# 和 Python 中同一問題的解決方案。Python 的看起來不是更……漂亮嗎?再說一次,也許是因為柵欄另一邊的草總是很茂盛。

我學(xué)到的與 C# 無關(guān)的東西

你可以從求職面試中學(xué)到很多東西。既是面試官,又是被面試者。我在整個過程中學(xué)到的最重要的東西與 C# 或任何其他語言無關(guān)。由于這篇文章是關(guān)于編碼挑戰(zhàn)的,我將堅持我從這些方面學(xué)到的東西。以下是我學(xué)到的一些技巧和竅門,可以幫助我解決編碼問題:

熟能生巧

面試的準(zhǔn)備是一切的不同之處。是的,這需要很多時間,但考慮到風(fēng)險,這是非常值得的。從嚴(yán)格的財務(wù)角度來看,在薪水高、資歷高的公司工作,是您一生中最重要的財務(wù)改善之一。花幾天或幾周的時間為它們做準(zhǔn)備絕對值得。

對于編碼問題,我使用了leetcode.com[2],這是解決此類[3]問題的最佳網(wǎng)站之一。我建議從簡單的問題開始,花最多的時間在中等,并嘗試一些困難的問題。該站點的最佳功能之一是您可以在每個問題的討論部分看到其他提交的內(nèi)容。該網(wǎng)站非常受歡迎,所以總是有各種語言的提交。我建議您先嘗試自己解決問題,然后再查看其他提交的內(nèi)容(即使您成功了)。我當(dāng)然從中學(xué)到了很多。

大多數(shù)問題都很簡單

如果您瀏覽leetcode.com 之[4]類的網(wǎng)站[5],您可能會認(rèn)為 Facebook 或 Apple 等頂級公司會問您非常棘手的[6]問題。根據(jù)我的經(jīng)驗,這不是真的。大多數(shù)問題都在中等難度范圍內(nèi)。不太容易,但也不難,絕對不難。許多問題都是遞歸 DFS 或 BFS 的經(jīng)典實現(xiàn)。或者Bin 裝箱問題[7]的變體。有時您需要遍歷二叉樹。在極少數(shù)情況下,您可能需要使用堆。

但是你也可能在簡單和中等的問題上失敗。相信我,我知道。面試壓力很大。您必須非常迅速地提出解決方案。有時面試官會把你引向錯誤的方向(無論是有意還是無意)。其他時候,您可能會記住某些事情或分心,這會使您偏離正確(且簡單)的解決方案。

我學(xué)會了始終牢記這個問題可能并不棘手,但很容易。這大多是真實的,思考可以減輕一些壓力。

寫之前想一想

在實際編寫解決方案之前,請多想一想。它是最優(yōu)化的嗎?你能達(dá)到更好的時間復(fù)雜度嗎?代碼是否會簡短易懂?問問自己是否可以改進(jìn)解決方案。

通常,面試官會在實際編寫之前要求您描述您的解決方案。這對你來說很棒。即使他們不問,我也建議你自己解釋一下。解釋完之后,寫代碼就容易多了。此外,您經(jīng)常會在解決方案中發(fā)現(xiàn)一些問題。這也是與面試官建立聯(lián)系的好機會。你可以向他們展示你的思維過程,證明你是一個聰明的人,很容易相處。

使用簡稱

在軟件開發(fā)中,我們非常習(xí)慣于描述性的名稱。所以我會有一個方法GetAddressandCalculateFastestRoute而不是Getand Calc。在編碼問題中,恰恰相反的是要走的路。至少這對我有用。堅持為變量名稱和方法使用短名稱。如果你覺得你的面試官是一個固執(zhí)的人,你可以在你的解決方案奏效后給他們重命名,或者只是提到你在這次面試中使用了簡稱,而不是常規(guī)。

我不是說要命名您的方法A和B. 但我是說,如果您的問題是遍歷迷宮,并且您使用的是深度優(yōu)先搜索算法,請隨意命名該方法DFS而不是FindAWayInAMaze.

總結(jié)

一家大企業(yè)面試是一種迷人的經(jīng)歷。這與為初創(chuàng)公司甚至大型科技公司接受面試完全不同。公司之間的面試有很大的不同,你可以了解一些公司文化。

我在這里談到了編碼問題,但這只是面試的一部分。大多數(shù)公司也有某種“系統(tǒng)設(shè)計”面試,你必須架構(gòu)一個大型(通常是分布式)系統(tǒng)。面試過程的另一部分是關(guān)于你在組織中的行為、態(tài)度和行為。

你是團(tuán)隊成員嗎?您是否總是為客戶著想?你能獨立工作嗎?這些可能與技術(shù)問題一樣重要。

References

[1] leetcode.com: https://leetcode.com/

[2] leetcode.com: https://leetcode.com/

[3] 此類: https://leetcode.com/

[4] leetcode.com 之: https://leetcode.com/

[5] 網(wǎng)站: https://leetcode.com/

[6] 棘手的: https://leetcode.com/

 

[7] Bin 裝箱問題: https://en.wikipedia.org/wiki/Bin_packing_problem

 

責(zé)任編輯:武曉燕 來源: DotNET技術(shù)圈
相關(guān)推薦

2013-08-19 12:46:27

2021-03-09 09:55:02

Vuejs前端代碼

2020-12-31 10:47:03

開發(fā)Vuejs技術(shù)

2016-01-18 10:06:05

編程

2014-12-22 10:09:50

工程師

2018-08-14 05:34:19

2021-10-11 09:55:58

Facebook業(yè)務(wù)中斷網(wǎng)絡(luò)安全

2020-05-19 13:46:33

勒索軟件信息安全攻擊

2023-11-29 07:29:28

ReactSolid

2020-06-14 15:09:00

JavaScript開發(fā)技術(shù)

2015-05-06 14:36:56

CIO云計算風(fēng)險云遷移

2010-10-12 11:06:07

招聘

2020-11-04 07:13:57

數(shù)據(jù)工程代碼編程

2021-07-28 07:01:09

薅羊毛架構(gòu)Vue+SSR

2020-11-03 09:50:26

CIO遠(yuǎn)程IT在家工作

2023-11-24 13:24:14

CIOOptus

2024-04-07 14:11:42

ITGenAI

2020-04-03 14:05:10

面試RedisJava

2015-09-24 09:41:04

Amazon云停機云安全教訓(xùn)

2020-01-08 14:32:06

物聯(lián)網(wǎng)黑客網(wǎng)絡(luò)安全
點贊
收藏

51CTO技術(shù)棧公眾號