成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我從大廠面試中學到的關于 C# 的知識

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

[[412977]]

本文轉載自微信公眾號「DotNET技術圈」,作者Michael Shpilt。轉載本文請聯系DotNET技術圈公眾號。

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

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

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

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

多維數組

我認為我在工作中從未使用過多維數組。當然,我有時會使用一個列表列表List

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

  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 

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

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

使用元組,而不是類

我已經用 C# 編程一段時間了,我很少使用元組。可能是因為我不習慣ValueTuple. 我的默認選擇通常是一個類。對于類有一些好處:它們使代碼更加結構化并且可以說更具可讀性。但是元組實際上有一個非常好的語法。也許,更重要的是,它們具有更

緊湊的

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

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

  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(){ ... } 

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

二元運算也是一回事

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

  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 

關于二進制的一件事是,以基數 2 進行迭代可能有助于解決置換問題。例如,考慮以下問題:

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

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

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

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

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

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

字符串和數組的有用內容

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

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

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

  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. 除此之外,它還可以將數組的切片復制到新數組中。例如:

  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 

還有其他方法可以復制數組切片。其中之一是使用 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。在編碼問題中,恰恰相反的是要走的路。至少這對我有用。堅持為變量名稱和方法使用短名稱。如果你覺得你的面試官是一個固執的人,你可以在你的解決方案奏效后給他們重命名,或者只是提到你在這次面試中使用了簡稱,而不是常規。

我不是說要命名您的方法A和B. 但我是說,如果您的問題是遍歷迷宮,并且您使用的是深度優先搜索算法,請隨意命名該方法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

 

責任編輯:武曉燕 來源: DotNET技術圈
相關推薦

2013-08-19 12:46:27

2021-03-09 09:55:02

Vuejs前端代碼

2020-12-31 10:47:03

開發Vuejs技術

2016-01-18 10:06:05

編程

2014-12-22 10:09:50

工程師

2020-05-19 13:46:33

勒索軟件信息安全攻擊

2021-10-11 09:55:58

Facebook業務中斷網絡安全

2018-08-14 05:34:19

2015-05-06 14:36:56

CIO云計算風險云遷移

2010-10-12 11:06:07

招聘

2023-11-29 07:29:28

ReactSolid

2020-11-04 07:13:57

數據工程代碼編程

2020-06-14 15:09:00

JavaScript開發技術

2021-07-28 07:01:09

薅羊毛架構Vue+SSR

2020-11-03 09:50:26

CIO遠程IT在家工作

2015-09-24 09:41:04

Amazon云停機云安全教訓

2020-01-08 14:32:06

物聯網黑客網絡安全

2024-04-07 14:11:42

ITGenAI

2023-11-24 13:24:14

CIOOptus

2020-04-03 14:05:10

面試RedisJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 香蕉久久久 | 青青久久久 | 国产精品久久久久久久久久免费看 | 一级二级三级黄色 | 爱综合| 玖玖免费 | 羞羞的视频在线观看 | 久久久久国产 | 国产精品久久久久久 | 激情欧美一区二区三区中文字幕 | 免费在线观看黄色av | 欧美综合一区 | 亚洲国产精品视频一区 | av在线一区二区三区 | 久久久久九九九女人毛片 | 又黄又色 | 97色在线视频 | 久久大全| 亚洲aⅴ一区二区 | 亚洲福利av | 成人在线精品 | 国产成人网 | 久久精品一区 | 亚洲精品久久久久久下一站 | 日本三级做a全过程在线观看 | 黄色免费av | 国产精品一区二区在线 | a级毛片国产| 国产日韩欧美一区 | 亚洲精品中文字幕 | 亚洲自拍偷拍av | 亚洲一区二区免费视频 | 91在线精品一区二区 | 国产乱码精品一区二区三区五月婷 | 国产精品免费高清 | 久久久久亚洲 | 国产一极毛片 | 国产在线一区二区三区 | 欧美精品一区免费 | 免费日韩av | 久久精品综合 |