Cuộc phỏng vấn mã hóa xuất sắc nhất với Python GitHub

Đây là tập hợp các ghi chú của tôi khi tôi đang/đang học phỏng vấn [hoặc chỉ để học] và nó cũng nhằm mục đích trở thành một hướng dẫn có hệ thống cho những người muốn trở thành kỹ sư phát triển phần mềm [SDE]

Tôi đã tốt nghiệp với tư cách là Kỹ sư điện và sau khi làm việc 1. 5 năm làm Kỹ sư điện tôi quyết định chuyển sang thế giới lập trình. Tôi chỉ có một khóa học lập trình ở trường đại học và tôi đã tự học tất cả các cấu trúc dữ liệu và thuật toán phổ biến nhất, nguyên tắc cơ bản về máy học và kiến ​​trúc phần mềm. Tôi bắt đầu giải quyết các vấn đề về leetcode vào cuối tháng 2 năm 2020 và kể từ đó, tôi giải quyết được ít nhất 1 vấn đề mỗi ngày

Trong suốt hành trình học tập của mình, tôi thấy rằng tôi đã học được tất cả các kiến ​​thức từng phần một khi tôi cần chúng, nhưng tôi luôn thiếu một sự hiểu biết/tổng ​​quan một cách có hệ thống. Vì tôi đã ghi chú rất nhiều trong quá trình học, nên tôi nghĩ cần phải tóm tắt chúng và biến chúng thành một hướng dẫn có hệ thống cho bất kỳ ai muốn trở thành kỹ sư phát triển phần mềm

Hy vọng repo này hữu ích và chúc bạn may mắn

Lời nói đầu 1. Làm thế nào để sử dụng repo này

Trong repo này, tôi sẽ chỉ cho bạn cách bắt đầu dành cho những người muốn chuyển đổi nghề nghiệp, cải thiện kỹ thuật phỏng vấn hoặc xem lại các nguyên tắc cơ bản

  • Tôi sẽ xây dựng một lộ trình có hệ thống cho các vấn đề về cấu trúc dữ liệu, thuật toán và thiết kế hệ thống
  • Tôi sẽ chia sẻ các mẹo và thủ thuật về cách thực hành các thuật toán
  • Tôi sẽ chia sẻ các kỹ thuật để trả lời các câu hỏi về hành vi [BQ]
  • Tôi sẽ cung cấp các tài nguyên mà tôi đã học được
  • ĐẢM BẢO BẠN ĐỌC

Quan trọng nhất, học tập là một hành trình dài cả đời, và tôi vẫn đang học tập hàng ngày. Hy vọng rằng bạn có thể học hỏi với tôi và tôi có thể giúp mọi người tiếp cận lĩnh vực này dễ dàng hơn hoặc cải thiện khả năng kỹ thuật của họ

Làm thế nào để sử dụng repo này.

Về cơ bản, bạn nên sử dụng repo này làm hướng dẫn [vâng, cái tên đã chỉ ra] để xây dựng cơ sở kiến ​​thức và mẫu của riêng bạn

Và nếu bạn có đủ thời gian, bạn nên xem qua mọi chủ đề. Nếu không, bạn chỉ có thể đọc các chủ đề bạn quan tâm

Lời nói đầu 2. Trước khi bắt đầu, HÃY NHỚ những sự thật sau

  • Lập trình là viết mã, không phải đọc. Vì vậy, đừng chỉ đọc, hãy THỰC HIỆN nó
  • Bạn không thể ghi nhớ mọi thứ ngay lần đầu tiên. Vì vậy, hãy tiếp tục lặp lại và thực hành, và VIẾT chúng ra giấy
  • Đừng cảm thấy mình không đủ thông minh. Trên thực tế, rất nhiều câu hỏi lập trình rất khó vì bạn chưa từng gặp chúng trước đây. Khi bạn đã xem đủ, bạn sẽ biết các thủ thuật
  • Đánh giá, đánh giá, đánh giá. Thỉnh thoảng xem lại mã và ghi chú của bạn, cố gắng cấu trúc lại/tối ưu hóa mã của bạn và làm mới ký ức của bạn về các nguyên tắc cơ bản
  • Học tập là một hành trình dài cả đời. Vì vậy, hãy tiếp tục học và đọc

Những điểm trên thực sự rất quan trọng, hãy ghi nhớ những điều này và chúng sẽ giúp bạn trong sự nghiệp

Bây giờ hãy bắt đầu hành trình của chúng ta

Mục lục

Phần 1. Cấu trúc dữ liệu và thuật toán

Sách. Giải quyết vấn đề với thuật toán và cấu trúc dữ liệu bằng Python

  • Đối với những người cần nghiên cứu các cấu trúc dữ liệu và thuật toán cơ bản, trước tiên nên xem kỹ sách giáo khoa ở trên, sau đó quay lại nội dung sau hoặc thực hành trên Leetcode hoặc nền tảng khác

Cấu trúc dữ liệu cơ bản

  • Mảng
  • Danh sách liên kết
  • Cây rơm
  • Xếp hàng
  • Bảng băm
  • Cây
  • đồ thị

Các loại thuật toán phổ biến

  • Lực lượng vũ phu
  • Tìm kiếm và Sắp xếp
  • đệ quy
  • quay lui
  • Lập trình năng động
  • Phân chia và chinh phục
  • Tham
  • Chi nhánh và ràng buộc

Ký hiệu chữ O lớn

  • Điều quan trọng là bạn hiểu và có thể tính toán Big O cho mã bạn đã viết

  • Hàm bậc độ lớn mô tả phần của T[n] tăng nhanh nhất khi giá trị của n tăng. Thứ tự độ lớn thường được gọi là ký hiệu Big-O [cho “thứ tự”] và được viết là O[f[n]]

  • Về cơ bản, Big O đo lường số lượng câu lệnh gán

    f[n]Tên1Hằng sốlog nLogaritmicnLog tuyến tính nLog Tuyến tính^2Quadraticn^3Cubic2^nLũy thừa

Chương 1. Cấu trúc dữ liệu

1. 1 Mảng

  • Một mảng [trong Python nó được gọi là danh sách] là một tập hợp các mục trong đó mỗi mục giữ một vị trí tương đối đối với các mục khác

1. 2 Danh sách liên kết

  • Tương tự như mảng, nhưng yêu cầu trung bình thời gian O[N] để truy cập một phần tử theo chỉ mục
  • Danh sách được liên kết sử dụng bộ nhớ tốt hơn mảng, vì nó có thể sử dụng không gian bộ nhớ rời rạc, trong khi mảng phải sử dụng không gian bộ nhớ liên tục
  • Chi tiết và Mẫu

1. 3 ngăn xếp

  • Ngăn xếp về cơ bản là quan trọng, vì chúng có thể được sử dụng để đảo ngược thứ tự của các mục
  • Thứ tự chèn ngược với thứ tự xóa
  • Ngăn xếp duy trì thuộc tính sắp xếp FILO [vào trước ra sau]
  • Khi pop được gọi ở cuối danh sách, nó nhận O[1] nhưng khi pop được gọi ở phần tử đầu tiên trong danh sách hoặc bất kỳ đâu ở giữa thì nó là O[n] [trong Python]
1. 3. 1 biểu thức số học
  • trung tố. toán tử nằm giữa hai toán hạng mà nó đang làm việc [i. e. A+B]
    • Biểu thức được ngoặc đơn đầy đủ. sử dụng một cặp dấu ngoặc đơn cho mỗi toán tử. [tôi. e. [[A + [B * C]] + D]]
  • Tiếp đầu ngữ. tất cả các toán tử đứng trước hai toán hạng mà chúng làm việc [i. e. +AB]
  • hậu tố. toán tử đứng sau toán hạng tương ứng [i. e. AB+]
Biểu thức tiền tốBiểu thức tiền tốBiểu thức hậu tốA + B+ A BA B +A + B * C+ A * B CA B C * +[A + B] * C* + A B CA B + C *A + B * C + D+ + A * B C DA B C
  • GHI CHÚ
    • Chỉ ký hiệu trung tố yêu cầu dấu ngoặc đơn để xác định mức độ ưu tiên
    • Thứ tự của các hoạt động trong các biểu thức tiền tố và hậu tố được xác định hoàn toàn bởi vị trí của toán tử và không có gì khác

1. 4 hàng đợi

  • Một hàng đợi được cấu trúc như một tập hợp các mục được sắp xếp theo thứ tự được thêm vào ở một đầu, được gọi là “phía sau” và được lấy ra ở đầu kia, được gọi là “phía trước”. ”
  • Hàng đợi duy trì thuộc tính đặt hàng FIFO
  • Deque, còn được gọi là hàng đợi hai đầu, là một tập hợp các mục tương tự như hàng đợi được sắp xếp theo thứ tự
    • Nó có hai đầu, mặt trước và mặt sau, và các vật phẩm vẫn được định vị trong bộ sưu tập
    • Các mục mới có thể được thêm vào ở phía trước hoặc phía sau
    • Tương tự như vậy, các mục hiện có có thể được gỡ bỏ từ một trong hai đầu

1. 5 Bảng Băm

  • Bảng băm là một tập hợp các mục được lưu trữ theo cách giúp dễ dàng tìm thấy chúng sau này
  • Mỗi vị trí của bảng băm, thường được gọi là vị trí, có thể chứa một mục và được đặt tên theo một giá trị số nguyên bắt đầu từ 0
  • Ánh xạ giữa một mục và vị trí mà mục đó thuộc về bảng băm được gọi là hàm băm
    • Phương thức phần còn lại lấy một mục và chia nó cho kích thước bảng, trả về phần còn lại dưới dạng giá trị băm của nó [i. e. h[item] = item % 11]
    • hệ số tải là số mục chia cho kích thước bảng
    • xung đột đề cập đến tình huống nhiều mục có cùng giá trị băm
    • phương pháp gấp để xây dựng hàm băm bắt đầu bằng cách chia mục thành các phần có kích thước bằng nhau [phần cuối cùng có thể không có kích thước bằng nhau]. Những phần này sau đó được cộng lại với nhau để tạo ra giá trị băm kết quả
    • phương pháp giữa hình vuông đầu tiên bình phương mục, sau đó trích xuất một số phần của các chữ số kết quả. Ví dụ: 44^2 = 1936, trích xuất hai chữ số ở giữa là 93, sau đó thực hiện bước còn lại [93%11=5]
  • Giải quyết xung đột là quá trình đặt mục thứ hai một cách có hệ thống trong bảng băm khi hai mục băm vào cùng một vị trí
  • Địa chỉ mở [thăm dò tuyến tính]. tuần tự tìm vị trí hoặc địa chỉ mở tiếp theo trong bảng băm
    • Một bất lợi đối với thăm dò tuyến tính là xu hướng phân cụm;
    • Rehashing là một cách để xử lý phân cụm, đó là bỏ qua vị trí khi tìm kiếm liên tục cho vị trí mở tiếp theo, do đó phân phối đồng đều hơn các mục đã gây ra xung đột
  • thăm dò bậc hai. thay vì sử dụng giá trị "bỏ qua" không đổi, chúng tôi sử dụng hàm băm lại để tăng giá trị băm lên 1, 3, 5, 7, 9, v.v. Điều này có nghĩa là nếu giá trị băm đầu tiên là h, thì các giá trị tiếp theo là h+1, h+4, h+9, h+16, v.v.
  • Xâu chuỗi cho phép nhiều mục tồn tại ở cùng một vị trí trong bảng băm
    • Khi xung đột xảy ra, mục vẫn được đặt trong vị trí thích hợp của bảng băm
    • Khi ngày càng có nhiều vật phẩm đến cùng một vị trí, độ khó tìm kiếm vật phẩm trong bộ sưu tập sẽ tăng lên
  • Kích thước ban đầu của bảng băm phải là một số nguyên tố để thuật toán giải quyết va chạm có thể hiệu quả nhất có thể

1. 6 Cây

  • Cấu trúc dữ liệu dạng cây có gốc ở trên và các lá ở dưới
  • Ba đặc tính của cây
    1. chúng tôi bắt đầu từ ngọn cây và đi theo một con đường tạo thành từ các vòng tròn và mũi tên cho đến tận cùng
    2. tất cả các nút con của một nút đều độc lập với các nút con của nút khác
    3. mỗi nút lá là duy nhất
  • Cây nhị phân. mỗi nút trong cây có tối đa hai nút con
    • Một cây nhị phân cân bằng có số nút ở cây con bên trái và bên phải của gốc gần như bằng nhau
1. 6. Đi ngang 1 cây. truy cập các nút của cây
  • Duyệt cây là nền tảng của tất cả các vấn đề liên quan đến cây
  • Dưới đây là một vài cách khác nhau để đi qua một cái cây
    • BFS. thứ tự cấp độ
    • DFS. Đặt trước, đặt trước, đặt sau
    • Chi tiết và Mẫu
1. 6. 2 Cây tìm kiếm nhị phân [BST]
  • Thuộc tính BST [cây con trái < gốc < cây con phải]
    1. Giá trị trong mỗi nút phải là greater than [or equal to] bất kỳ giá trị nào được lưu trữ trong cây con bên trái của nó
    2. Giá trị trong mỗi nút phải là less than [or equal to] bất kỳ giá trị nào được lưu trữ trong cây con bên phải của nó
  • Inorder traversal trong BST sẽ có trong ascending order. Do đó, truyền tải theo thứ tự là phương thức truyền tải được sử dụng thường xuyên nhất của BST
  • người kế vị. nút có khóa lớn nhất tiếp theo trong cây
    • nó không có nhiều hơn một đứa con
  • Bạn có thể xem qua chủ đề Cây tìm kiếm nhị phân Leetcode để biết chi tiết
1. 6. 3 Heap / Hàng đợi ưu tiên / Heap nhị phân
  • Hàng đợi ưu tiên
    • thứ tự hợp lý của các mục bên trong hàng đợi được xác định theo mức độ ưu tiên của chúng
    • Các mục có mức độ ưu tiên cao nhất ở phía trước hàng đợi và các mục có mức độ ưu tiên thấp nhất ở phía sau
  • đống nhị phân. cách cổ điển để triển khai hàng đợi ưu tiên
    • cả hai mục enqueue và dequeue đều là O[logn]
    • đống tối thiểu. phím nhỏ nhất luôn ở phía trước
    • đống tối đa. giá trị khóa lớn nhất luôn ở phía trước
    • cây nhị phân hoàn chỉnh. một cây trong đó mỗi cấp có tất cả các nút của nó [ngoại trừ cấp dưới cùng]
      • có thể được thực hiện bằng cách sử dụng một danh sách duy nhất
      • Bởi vì cây đã hoàn thành, con trái của nút cha [ở vị trí p] là nút được tìm thấy ở vị trí 2p trong danh sách. Tương tự, con bên phải của cha nằm ở vị trí 2p+1 trong danh sách.
    • tài sản đặt hàng đống. Trong một đống, với mọi nút x có cha là p, khóa trong p nhỏ hơn hoặc bằng khóa trong x
      • Ví dụ, gốc của cây phải là phần nhỏ nhất trong cây
    • Khi nào thì sử dụng đống
      • Triển khai hàng đợi ưu tiên
      • bất cứ khi nào cần truy cập nhanh vào mục lớn nhất/nhỏ nhất
        • Truy cập tức thì vào mục
        • chèn nhanh, cho phép sắp xếp tại chỗ
      • Thông tin chi tiết có thể được nhìn thấy trong cuộc thảo luận này
1. 6. 4 cây nữa
  • Cây phân tích cú pháp có thể được sử dụng để biểu diễn các cấu trúc trong thế giới thực như câu hoặc biểu thức toán học
    • Một giải pháp đơn giản để theo dõi cha mẹ khi chúng ta duyệt qua cây là sử dụng ngăn xếp
    • Khi chúng ta muốn xuống một nút con của nút hiện tại, trước tiên chúng ta đẩy nút hiện tại vào ngăn xếp
    • Khi chúng tôi muốn trở về nút cha của nút hiện tại, chúng tôi đưa nút cha ra khỏi ngăn xếp
  • Cây AVL. cây nhị phân cân bằng. AVL được đặt tên theo nhà phát minh của nó G. M. Adelson-Velskii và E. M. Landis
    • Đối với mỗi nút. balanceFactor = height[leftSubTree] − height[rightSubTree]
    • một cây con là trái nặng nếu balance_factor > 0
    • một cây con là đúng nặng nếu balance_factor < 0
    • một cây con hoàn toàn cân bằng nếu balance_factor = 0
    • Để đơn giản, chúng ta có thể định nghĩa một cây cân bằng nếu hệ số cân bằng là -1, 0 hoặc 1
    • Số nút tuân theo mẫu của dãy Fibonacci, khi số lượng phần tử càng lớn thì tỷ lệ Fi/Fi-1 càng gần với tỷ lệ vàng, do đó độ phức tạp thời gian được suy ra là O[log n]
  • Cây đỏ đen
    • Chi tiết trong Wiki
  • Cây B+. cây mảng N
    • Chi tiết trong Wiki
  • Trie
    • Đây là cấu trúc dữ liệu phổ biến trong các cuộc phỏng vấn
    • Mẫu
  • Cây chỉ mục nhị phân [Cây Fenwick]
    • Cây chỉ mục nhị phân [Cây Fenwick]
    • 315. Đếm các số nhỏ hơn sau tự

1. 7 Đồ thị

1. 7. 1 Từ vựng và Định nghĩa
  • Đỉnh [hoặc Nút]. tên được gọi là "key" và thông tin bổ sung được gọi là "payload"
  • Cạnh [hoặc cung]. nó kết nối hai đỉnh để chỉ ra rằng có một mối quan hệ giữa chúng
    • Cạnh một chiều gọi là đồ thị có hướng [hay đồ thị có hướng]
  • Cân nặng. các cạnh có thể có trọng số để chỉ ra rằng có một corset để đi từ đỉnh này sang đỉnh khác
  • Đường dẫn. một chuỗi các đỉnh được kết nối bny cạnh
    • Độ dài đường dẫn không trọng số là số cạnh trong đường dẫn, cụ thể là n-
    • Đường có trọng số là tổng trọng số của tất cả các cạnh trong đường đi
  • Xe đạp. một con đường bắt đầu và kết thúc tại cùng một đỉnh
    • Đồ thị không có chu trình gọi là đồ thị tuần hoàn
    • Đồ thị có hướng không có chu trình được gọi là đồ thị theo chu trình có hướng [hoặc DAG]
  • đồ thị. một đồ thị [G] bao gồm một tập hợp các đỉnh [V] và các cạnh [E] Mỗi ​​cạnh là một bộ đỉnh và trọng số [v,w]. G=[V,E] trong đó w,v∈V
1. 7. 2 Biểu diễn đồ thị
  • Ma trận kề [ma trận 2D]
    • Tốt khi số cạnh lớn
    • Mỗi hàng và cột đại diện cho một đỉnh trong biểu đồ
    • Giá trị trong ô tại giao điểm của hàng v và cột w cho biết liệu có một cạnh từ đỉnh v đến đỉnh w. Nó cũng đại diện cho trọng số của cạnh từ đỉnh v đến đỉnh w
    • Khi hai đỉnh được nối với nhau bởi một cạnh, chúng ta nói rằng chúng kề nhau
    • thưa thớt. hầu hết các ô trong ma trận đều trống
  • Danh sách kề
    • cách hiệu quả về không gian để thực hiện
    • giữ một danh sách tổng thể của tất cả các đỉnh trong đối tượng Graph. mỗi đỉnh là một phần tử của danh sách với đỉnh là ID và danh sách các đỉnh liền kề của nó là giá trị
1. 7. 3 thuật toán đồ thị
  • duyệt đồ thị. BFS & DFS
    • Mẫu
  • thuật toán đồ thị
    • Con đường ngắn nhất
      • Thuật toán Dijkstra [Điểm nguồn đơn]
        • Về cơ bản, đây là BFS sử dụng hàng đợi ưu tiên thay vì hàng đợi
        • Mẫu
      • Thuật toán Floyd Warshall [Nhiều điểm nguồn]
    • Sắp xếp tô pô
      • Mẫu
    • Các thành phần được kết nối mạnh mẽ
      • Thêm thông tin
    • Thuật toán Spanning Tree của Prim
      • Thêm thông tin

chương 2. Các loại thuật toán phổ biến

2. 1 vũ phu

  • Thuật toán phổ biến nhất
  • Bất cứ khi nào bạn đối mặt với một vấn đề mà không có nhiều manh mối, bạn nên giải quyết nó bằng vũ lực trước, đồng thời quan sát quá trình và cố gắng tối ưu hóa giải pháp của mình

2. 2 Tìm kiếm

2. 2. 1 tìm kiếm tuần tự
  • tìm kiếm tuần tự. truy cập giá trị được lưu trữ theo trình tự [sử dụng vòng lặp]
2. 2. 2 tìm kiếm nhị phân
  • Kiểm tra mục giữa của một danh sách có thứ tự
  • KEY là khoảng thời gian tìm kiếm
  • Mẫu

2. 3 Sắp xếp

2. 3. 1 Sắp xếp bong bóng
  • So sánh các mặt hàng liền kề và trao đổi những mặt hàng không đúng thứ tự
  • bong bóng ngắn. dừng sớm nếu thấy rằng danh sách đã được sắp xếp
  • thời gian phức tạp. O[n2]
2. 3. 2 Sắp xếp lựa chọn
  • Tìm kiếm giá trị lớn nhất khi nó vượt qua và sau khi hoàn thành vượt qua, hãy đặt nó vào vị trí thích hợp
  • thời gian phức tạp. O[n2]
2. 3. 3 Sắp xếp Chèn
  • Duy trì một danh sách con được sắp xếp ở các vị trí thấp hơn của danh sách
  • Sau đó, mỗi mục mới được "chèn" trở lại vào danh sách con trước đó sao cho danh sách con được sắp xếp lớn hơn một mục
  • thời gian phức tạp. O[n2]
2. 3. 4 Sắp xếp vỏ
  • Chia danh sách ban đầu thành một số danh sách con nhỏ hơn, mỗi danh sách được sắp xếp bằng cách sử dụng sắp xếp chèn
    • sắp xếp hệ vỏ sử dụng số gia i, đôi khi được gọi là khoảng cách, để tạo danh sách con bằng cách chọn tất cả các mục cách nhau i mục
    • Sau khi tất cả các danh sách con được sắp xếp, nó cuối cùng cũng thực hiện sắp xếp chèn tiêu chuẩn
    • độ phức tạp về thời gian nằm trong khoảng từ O[n] đến O[n2], bằng cách thay đổi gia số, sắp xếp hệ vỏ có thể thực hiện tại O[n^[3/2]]
2. 3. 5 Hợp nhất Sắp xếp
  • Một thuật toán đệ quy liên tục chia một nửa danh sách
  • Chi tiết và Mẫu
2. 3. 6 Sắp xếp nhanh
  • Đầu tiên, chọn một giá trị [giá trị trục], sau đó sử dụng giá trị này để hỗ trợ tách danh sách
  • Chi tiết và Mẫu
2. 3. 7 Sắp Xếp Đống
  • Sử dụng thuộc tính của heap để sắp xếp danh sách

2. 4 đệ quy

Đệ quy là một phương pháp giải quyết vấn đề liên quan đến việc chia nhỏ vấn đề thành các vấn đề con nhỏ hơn và nhỏ hơn cho đến khi bạn nhận được một vấn đề đủ nhỏ để có thể giải quyết một cách đơn giản. Thông thường đệ quy liên quan đến một chức năng gọi chính nó

Ba định luật đệ quy

  1. Một thuật toán đệ quy phải có trường hợp cơ sở
  2. Thuật toán đệ quy phải thay đổi trạng thái của nó và chuyển sang trường hợp cơ sở
  3. Một thuật toán đệ quy phải gọi chính nó, đệ quy

trực quan hóa đệ quy. cây fractal

  • Fractal là thứ trông giống nhau ở mọi mức độ phóng đại khác nhau
  • cây fractal. một cành cây nhỏ có hình dạng và đặc điểm giống như một cái cây
2. 4. 1 Hàm đệ quy trong Python
  • Khi một hàm được gọi trong Python, một khung ngăn xếp được phân bổ để xử lý các biến cục bộ của hàm
  • Khi hàm trả về, giá trị trả về được để lại trên đầu ngăn xếp để hàm gọi truy cập
  • Mặc dù chúng ta đang gọi đi gọi lại cùng một chức năng, nhưng mỗi cuộc gọi sẽ tạo ra một phạm vi mới cho các biến cục bộ của hàm

2. 5 quay lui

  • một thuật toán chung để tìm tất cả [hoặc một số] giải pháp để hạn chế các vấn đề về sự hài lòng [i. e. cờ vua, câu đố, trò chơi ô chữ, số học bằng lời nói, Sudoku, v.v.]
  • Mẫu

2. 6 Lập trình động

Lập trình động [DP] là một kỹ thuật thuật toán thường dựa trên công thức truy hồi và một [hoặc một số] trạng thái bắt đầu. - Một giải pháp con của vấn đề được xây dựng từ các giải pháp đã tìm thấy trước đó. - Thường dùng để tìm các trường hợp cực trị như đường đi ngắn nhất, khớp tốt nhất, tập nhỏ nhất, v.v.

2. 7 Chia để trị

  • Chia. chia thành các vấn đề con không chồng chéo cùng loại [của vấn đề]
  • chinh phục. giải quyết các vấn đề phụ
  • thuật toán là tiếp tục phân chia và chinh phục, và cuối cùng kết hợp chúng để có được giải pháp
  • thuật toán có thể được viết dưới dạng đệ quy hoặc vòng lặp

2. 8 tham lam

thuật toán tham lam

  • tìm một di chuyển an toàn đầu tiên
  • chứng minh an toàn
  • giải quyết vấn đề con [tương tự như vấn đề ban đầu]
  • ước tính thời gian chạy

Tối ưu hóa

  • giả sử mọi thứ đã được sắp xếp [nếu không, có thể sắp xếp trước]

  • quyết định thứ tự sắp xếp

  • thời gian chạy cuối cùng có thể là O[n log n] [i. e. sắp xếp là O[log n], di chuyển tham lam có thể là O[n]]

  • Thêm chi tiết

2. 9 Nhánh và Ràng buộc

Chương 3. Kỹ thuật và thuật toán thường được sử dụng

3. 1 Phải biết cho cuộc phỏng vấn

  • Truyền tải ma trận
    • Tập trung vào nhiều cách khác nhau để duyệt qua ma trận 2D
    • Mẫu
  • cửa sổ trượt
    • Về cơ bản đây là một cách tiếp cận hai con trỏ
    • Mẫu
  • đoàn tìm
    • Về cơ bản, nó là một đại diện danh sách cho các điểm dữ liệu chung
    • Mẫu
  • Thao tác bit
  • tiền tố tổng
  • ngăn xếp/hàng đợi đơn điệu
    • Mẫu ngăn xếp đơn điệu

3. 2 Điều cần biết nhưng có thể bỏ qua

  • Cây phân đoạn
  • Thuật toán Kadane
  • lấy mẫu hồ chứa
  • quét dòng
  • Thuật toán KMP [khớp mẫu]
  • Manacher [Chuỗi con Palindromic dài nhất]
  • Bỏ qua danh sách

Tóm lược

Phần 2. Thiết kế hệ thống

Chương 4. Mẫu phỏng vấn thiết kế hệ thống

Các câu hỏi thiết kế hệ thống có thể rất khó chuẩn bị vì nó bao gồm nhiều lĩnh vực

Đây là một mẫu tôi sử dụng cho cuộc phỏng vấn thiết kế hệ thống

  1. Tính năng kỳ vọng [5 phút] - thu thập yêu cầu

    • Yêu cầu chức năng
      • Trường hợp sử dụng
      • Các kịch bản sẽ KHÔNG được bảo hiểm
      • Người dùng cuối [người sẽ sử dụng nó]
      • Dung lượng [có bao nhiêu người sẽ sử dụng nó, DAU [người dùng hoạt động hàng ngày]]
      • Làm thế nào để sử dụng nó
    • Những yêu cầu vô lý
      • khả năng mở rộng
      • khả dụng
      • Hiệu suất/Độ trễ
      • Tính nhất quán
      • Độ bền/Khả năng chịu lỗi
  2. Ước tính [2-5 phút] - ước tính tỷ lệ

    • Thông lượng [QPS cho truy vấn đọc và ghi]
    • Độ trễ dự kiến ​​từ hệ thống [đối với truy vấn đọc và ghi]
    • Tỷ lệ Đọc/Ghi [đọc nặng, ghi nặng hoặc tương tự]
    • Ước tính lưu lượng truy cập [QPS để đọc và ghi]
    • Ước tính dung lượng lưu trữ [tệp phương tiện, văn bản/ảnh/video]
    • Ước tính bộ nhớ
      • Bộ nhớ cache. loại dữ liệu chúng tôi muốn lưu trữ trong bộ đệm là gì
      • Bao nhiêu RAM và bao nhiêu máy
      • Bao nhiêu dữ liệu được lưu trữ trên đĩa / ssd
  3. High Level Design [5-10 min] - discuss a very high level with the interviewer

    • System components [load balancer, services, cache, database, etc]
    • Lược đồ cơ sở dữ liệu
    • API cho kịch bản Đọc/Ghi cho các thành phần quan trọng
    • Quy trình luồng yêu cầu [từ máy khách đến cơ sở dữ liệu]
  4. Lặn sâu [15-20 phút] - tập trung vào bất kỳ phần nào của thành phần

    • Chia tỷ lệ thành phần riêng lẻ
      • Câu chuyện về tính khả dụng, tính nhất quán và quy mô cho từng thành phần
      • Các mẫu nhất quán và sẵn có
    • Tìm hiểu sâu về bất kỳ thành phần nào sau đây
      • DNS
      • CDN [Kéo so với Đẩy so với Kết hợp]
      • Cân bằng tải/Proxy đảo ngược
        • các loại LB
        • thuật toán LB
      • Application layer scaling [Microservice, Service Discovery, Service Mesh]
      • Database [RDBMS vs NoSQL]
        • RDBMS
          • Leader-follower, Multi-leader, Leaderless, Federation, Sharding, Denormalization, SQL Tuning
        • NoSQL
          • Key-Value, Wide-Column, Graph, Document
          • RAM [Bounded size] => Redis, Memcached
          • AP [Unbounded size] => Cassandra, RIAK, Voldemort
          • CP [Unbounded size] => HBase, MongoDB, Couchbase, DynamoDB
      • Caches
        • Client caching, CDN caching, Webserver caching, Database caching, Application caching, Cache at Query level, Cache at Object level
        • Cache Patterns
          • Cache aside
          • Write through
          • Write behind
          • Refresh ahead
        • Eviction policies
          • LRU
          • LFU
          • FIFO
      • Asynchronism
        • Message queues
        • Task queues
        • Back pressure
      • Communication
        • TCP
        • UDP
        • REST
        • RPC
  5. Justify [5 mins]

    • Throughput of each layer
    • Latency caused between each layer
    • Overall latency justification

Notes

  • Treat the system design as an actual work project, for which you have to gather and clear all the requirements and then do the design, and treat your interviewer as your colleague to discuss the trade offs for your design
  • Step 1 is the most important one, you'll need to know what you are about to build after all, and figure out all the requirements needed
  • Bước 2 nên được hỏi, nhưng hầu hết thời gian bạn có thể được yêu cầu thiết kế một hệ thống khi khởi động [tôi. e. you don't have many users], and then scale as you have more customers. So you don't have to give a detailed analysis at the beginning, unless is specifically asked
  • API design vs database schema design. you probably don't need to talk about both. DB design is asked more frequently in my experience
  • The key in system design is talking about trade offs, why you selected certain technologies over others and what are the draw backs

Reference

  • System Design Template
  • System Design - InterviewBit
  • SNAKE - System Design Principles to crack a system design in 5 steps . Bowen's blog

Chapter 5. System Design Components

Network systems will eventually comes down to these components and design patterns, so it is critical to understand these components and be able to discuss design decisions and trade offs for any component

  • Internet Protocol Suite
    • OSI model
    • Internet protocol suite
    • TCP, UDP, QUIC, SCTP, TCP/IP
    • HTTP, HTTPS
    • socket, websocket, long-polling
    • REST, SOAP
    • HTTP response status codes
  • Load Balancer, Reverse Proxy, API Gateway
    • LB types. layer 4 and layer 7
    • LB algorithms. least connection, least response time, least bandwidth, round robin, IP hash
    • Reverse Proxy
    • API Gateway
    • An example. The Architecture of Uber’s API gateway
  • Cache
    • Cache Usage Pattern
      • Cache Aside
      • Cache-as-SoR [system-of-record]. Read through, write through, write behind
    • Cache Eviction Policies
    • Redis vs Memcached
  • Data Store
    • Database Management Systems
      • Design Principals
        • Replication & Partition
          • Leader-follower replication, Sync/Async replication
          • Handling node outage
          • Replication logs
          • Eventual consistency
          • Multi-leader replication Topology, write conflict resolve
          • Leaderless replication, Quorum, sloppy quorum, hinted handoff
          • Key-value store partition
          • Local and Global index
          • Rebalancing partition
          • Coordination service, gossip protocol
        • Transaction & Isolation
          • ACID
          • Read committed
          • Read skew
          • Snapshot isolation
          • MVCC
          • Lost update
          • Write skew
          • Phantom
          • Two-phase locking [2PL]. Shared lock, exclusive lock, predicate lock, index-range lock
          • Serializable Snapshot Isolation [SSI]
        • Consistency & Consensus
          • Linearizability
          • CAP theorem
          • Causal dependency, consistent with causality, causally consistent
          • Total order, partially ordered
          • Lamport timestamp
          • Total Order Broadcast
          • Fencing token. tăng số đơn điệu cho khóa
          • epoch number. monotonically increasing number for election
          • 2PC, 3PC, XA transaction
      • Major Types
        • RDBMS
          • Postgres vs MySQL
        • NoSQL
          • NoSQL database types
          • Cassandra vs MongoDB
    • Data Storage Systems
      • File Storage
      • Block Storage
      • Object Storage
      • HDFS and Map Reduce
  • Architectural Patterns

Now put them together, here is something you should know

  • What happens when you navigate to an url
  • How to scale web app from monolithic to distributed

Chapter 6. Classic Designs

  • notification system
  • rate limiter
  • top k problem
  • hàng đợi tin nhắn phân tán
  • bộ đệm phân tán

Chương 7. Nghiên cứu điển hình về thiết kế hệ thống

  • hệ thống trò chuyện [slack, v.v.]
  • hệ thống phát trực tuyến [youtube, v.v.]
  • hệ thống bản đồ [google map, v.v.]
  • booking system [ticket master, etc]
  • notification system
  • nguồn cấp tin tức
  • hệ thống thanh toán
  • top k [hệ thống khuyến nghị, v.v.]
  • trình rút gọn url
  • trình thu thập dữ liệu web phân tán
  • search auto-completion system
  • file system [dropbox, google drive]

Section 3. Transferrable Skills and Offer

Chapter 8. Behavioral Questions [BQ]

8. 1 Four things to remember for the BQ

  • Behavioral Questions have been evaluated more and more in interviews, so make sure you are well prepared before you go to an interview
  • There are many many articles online talking about behavioral questions, so if you are looking for an answer to a specific question, just go ahead and search that question on Google and YouTube
  • Be prepared to TALK ABOUT YOUR RESUME
    • Make sure you can answer anything you put on your resume, technologies, projects, experience, etc
  • use STAR to make your stories
    • situation. briefly describe the background
    • task. briefly describe what was needed to be done
    • action. describe what you did, focus on what YOU did
    • results. show the results, especially YOUR impact

8. 2 How to prepare for BQ

Follow these steps

  1. Prepare to talk about your resume

    • know all the technologies you've listed on your resume
    • be ready to explain why you quit each of your job [at least why quitted the most recent job]
    • be ready to talk about the projects you listed in your resume
      • technologies
      • challenges
      • YOUR impact, what did you do
      • collaborations
  2. There are three questions you must prepare

    1. Introduce yourself [a good way to prepare is the elevator pitch, google it if you don't know]
    2. Why ABC Company [i. e. why do you want to apply to/work for our company]
    3. Why do you want to quit [or quitted] your job [if you ever had a job]
  3. Go through the Amazon leadership Principles

    • Chuẩn bị 2 - 3 câu chuyện cho mỗi hiệu trưởng, và bạn sẽ giỏi trong hầu hết các cuộc phỏng vấn cho BẤT KỲ công ty nào
    • Amazon's 14 Leadership Principles Video via Jeff Bezo is really great
    • This list. Amazon asks these 35 questions in 95% of job interviews should give you enough details for the most common questions
    • Make sure you note down the stories you prepared, and practice to talk to others about them
  4. Make sure you give the following questions extra attention

    • Your strength and Weakness
    • The most challenging problem you've solved or project you worked on
      • A follow up question could be if you are doing it again now, how would you do it differently
    • Conflict with your colleagues
    • Disagree with your colleagues/boss
    • Mistakes/Failures you made and what did you learn from it
    • Lead teams [if you are senior or manager]
  5. Now you are prepared to answer questions, but you'll also need to prepare questions to ASK

    • Ask good questions will show the interviewers that you are interested in the company, the position, the job itself, and possibly your professionalism
    • Ask poking questions about the team and technology
      • Programming languages [Python, Java, etc]
      • Development technologies [Docker, K8s, etc]
      • Frameworks [Django, Spring, etc] and their versions [from the versions you'll know how up-to-date their tech stack is ]
      • development tools [IDEs, OS, Cloud providers, etc]
    • Generic questions
      • What is a day like in your company [this may seem too generic, but is quite important]. For example, what's the sprint like [do you have sprints], do you have standup [frequency and time], how many working hours per week, when do you start your day, and much more. Pick those that you are most interested in
      • What's the team like, what's the tech stack for the team, how many BE/FE/QA etc
      • These kinda questions show that you are really interested in the job and team. You'll need to know this info anyway if there will be an offer and you choose to accept it
    • Interview related questions
      • What's the interview process like [sometimes the HR/interviewer will let you know clearly, if not you should ask], how many rounds, etc
      • Its even possible to poke the potential questions. what areas will the interview cover [algorithms, system design, take home project, etc]
        • Its ok to ask, its your HR's decision whether to tell you
      • This article shows you How to predict your interview questions
    • Ask any questions that you might be interested through your interview
      • For example, when certain technologies were mention in your interview, you may ask your interview how those technologies are used in the company
    • NOTE this step is very important, it will not only show that you are interested in the company and the position, but also give you a chance to learn the company culture and tech stack, and then you can decide if you really want to work for this company or not
      • From the technical perspective, ask the tech stack and even specific versions will let you know if the team has lots of tech debt. Discussing certain technologies will also show that you are strong in the area
      • From the company culture perspective, how your interviewers dealing with certain situations will give you a sneak peak of how company operates and what the company culture looks like
  • Here are some really good resources for you to prepare

    • AGAIN if you wanna prepare for certain questions, there are lots examples online, just google, and use Youtube
    • There are also interview tips from the big company's website, make sure you check them out
    • Leetcode Interview Thoughts Amazon and Google
    • How to sell yourself in interviews — Interview Genie
    • How to answer interview questions about the Amazon leadership principle “Frugality” — Interview Genie
  • One more thing. During your daily work, make notes on the achievements you had. Write down the details in the STAR format as mentioned above so you won't forget it when you need it, but make sure you don't leak any sensitive data

Chapter 9. Offer Negotiation

  • Congratulations you got an offer. But should you accept it immediately?
  • Let me put it this way, its for your own sake to negotiate the offer
  • Offer Negotiation will not only show that you are seriously considering joining the company, but also will make you happy when you actually accept the offer
  • It is really unlikely that the company revoke the offer if you negotiated, but it is possible. Frankly speaking, do you really want to work at a place where you can't ask for anything?
  • There is really only ONE resource that I'd like to share. Ten Rules for Negotiating a Job Offer. Read it carefully and thoroughly, and you are good to go

Appendix 1. Question & Answer

DISCLAIMER. These QAs are my personal opinions and experience. They are not guaranteed to be the perfect solution to the question, but is something I found really helpful from my own experience

NOTE. You should read these QAs first before jumping into the content and resources, since these answers may save you lots time preparing the interview and potentially help you ace the interview

A1. 1 Technical Questions

A1. 1. 1 How to use LeetCode as a beginner

  • First of all, if you don't know what LeetCode is, google it and thank me later

  • As a beginner or new to algorithm questions, LeetCode can get overwhelming because there are almost 2000 [at the time of writing] problems

  • If you are new to algorithm and data structure, go the "Explore" tab on the top navigation bar, and go to the "Learn" row and learn all of them

  • Nếu bạn đã biết tất cả các cấu trúc dữ liệu và muốn thực hành, hãy làm các câu hỏi từ các thẻ và làm từ dễ đến khó

    • Note that most of the companies rarely test hard ones, but some highly frequent hard problems come up more often recently
  • If you are really familiar with all the data structures and common algorithms, do the problems randomly, so you can think the best data structure for solving the problems most efficiently

  • If you are time sensitive/critical [i. e. you have an interview in the near future or you are actively looking for jobs], do the company based questions [LeetCode premium feature]

A1. 1. 2 How to solve LeetCode problem EFFECTIVELY

Rule of thumb. make every question count

What I mean is that you have to really understand the question after you've solved it

It doesn't really matter if you solved it by yourself or looked at the answers

Here are a list of CRITICAL things you have to always think about when you are working on problems

  • What's the best data structure/s to solve this problem
  • What's the time and space complexity [Big O's]
  • What's the tradeoff for the current approach [i. e. more space or more time]

After solving the question [again whether you solved it yourself or looked at solution/discussion]

  • Is your solution the best way to solve it, if not is there a way to optimize your solution
  • If you can't solve it yourself, what was the reason?
    • Have you seen the data structure/algorithm before?
      • If not you should stop working on more problems and study that immediately
      • If so you should practice more on this type of problems
    • Is there any tricks when solving the problem?
      • If not just keep practicing
      • If so NOTE it
    • Did you have no clue when seeing the problem?
      • Practice more of this type of problems, and summarize the solution for each problem solved

If you strictly do above things when you are working on the problem and after you solved it, its just a matter of time until you are an expert

A1. 1. 3 How to solve LeetCode problem EFFICIENTLY

quy tắc ngón tay cái. Don't work on a single problem for too long, and don't be afraid to look at the solution

I know many people don't wanna look for a solution if they can't solve the problem, but spending too much time [i. e hours] on a single problem isn't efficient at all. Rốt cuộc bạn chỉ có 24 giờ một ngày

Vì vậy, đây là những gì bạn nên làm

  • If you have no clue at all after reading the question, look at solution directly
    • It may sounds a little cheese but this is the most efficient way cause you'll probably have no clue after 1 hour. Khi bạn đã giải đủ câu hỏi, điều này sẽ không xảy ra
  • If you have some clue but not sure how to do it, then spend some time work on it
    • Normally spend like 15 - 30 mins, and if you still can't solve it, look at the solution
  • Nếu bạn có một ý tưởng về cách giải quyết nó, hãy làm nó
    • Đối với trường hợp này, hãy dành nhiều thời gian như bạn cần, thậm chí là một giờ
    • Lý do là bạn biết cách giải, nhưng bạn chưa thực sự quen với cách tiếp cận nên bạn cần luyện tập nhiều hơn. Bằng cách tự mình giải nó sau nhiều lần thử và sai, bạn sẽ rất quen thuộc với câu hỏi này và bạn sẽ có thể giải nó rất nhanh vào lần sau

Tóm lại, thực sự chỉ có hai điểm

  1. Đừng sợ nhìn vào giải pháp
  2. Nếu bạn bị chặn, xem điểm 1

A1. 1. 4 Hãy chú ý đến những điều này khi giải quyết vấn đề [đạt được giá trị tối đa của bài toán leetcode]

quy tắc ngón tay cái. Xem xét các trường hợp cạnh, giải thích từng bước, phân tích độ phức tạp, xem qua mã cho trường hợp thử nghiệm

Để đạt được giá trị tối đa của các vấn đề về leetcode, bạn cần phải làm nhiều việc hơn là chỉ giải quyết vấn đề

Dưới đây là một số điều bạn cần hết sức chú ý khi giải quyết vấn đề, vì làm như vậy bạn sẽ chuẩn bị cho buổi phỏng vấn tốt hơn

  • Khi lần đầu tiên nhìn thấy vấn đề, hãy đặt nhiều câu hỏi như ranh giới, một số trường hợp cạnh, v.v.
    • Các vấn đề về Leetcode khá đơn giản, nó cho bạn thấy khá nhiều thứ. Tuy nhiên, trong cuộc phỏng vấn, bạn sẽ phải làm việc với người phỏng vấn để có được tất cả các chi tiết của vấn đề mà bạn sắp giải quyết. Đảm bảo rằng bạn hoàn toàn hiểu câu hỏi và nhận thức được ranh giới cũng như mọi trường hợp khó khăn có thể xảy ra
  • Khi giải quyết vấn đề, đừng chỉ viết mã ngay mà hãy cố gắng giải thích những gì bạn sắp làm trước bằng cách viết một số mã giả để minh họa quá trình suy nghĩ của bạn
    • Làm như vậy sẽ cho phép người phỏng vấn hiểu cách tiếp cận của bạn và có thể sửa lỗi cho bạn [hoặc hướng dẫn bạn] đi đúng hướng
    • Bạn thực sự có thể làm theo quy trình này khi giải quyết các vấn đề về leetcode. Ví dụ: trước tiên bạn có thể viết mã giả dưới dạng nhận xét, sau đó điền mã thực
    • Vì giao tiếp cũng là một yếu tố thực sự quan trọng trong quá trình phỏng vấn nên bước giải thích này sẽ giúp bạn chuẩn bị rất nhiều cho một cuộc phỏng vấn thực tế
  • Bạn có thể yêu cầu độ phức tạp về không gian và thời gian trước khi giải quyết vấn đề, nhưng hầu hết thời gian bạn nên đề cập đến điều này sau khi kết thúc vấn đề
    • Đảm bảo bạn phân tích cả độ phức tạp về thời gian và không gian
  • Cuối cùng nhưng không kém phần quan trọng, khi bạn đã có giải pháp, hãy nhớ xem qua mã của mình bằng một trường hợp thử nghiệm
    • Dù bạn có tin hay không, rất nhiều người không thể gỡ lỗi mã của chính họ
    • Làm như vậy cũng sẽ cho thấy một dấu hiệu rằng bạn nên xem lại mã của mình trước khi đẩy nó ra ngoài, đây là điều bạn nên làm trong công việc hàng ngày của mình

A1. 1. 5 Tại sao bạn nên sử dụng mẫu cho thuật toán và cấu trúc dữ liệu

Bạn có nên sử dụng các mẫu?

Đây là những lý do

  • Phỏng vấn là một quá trình căng thẳng và thời gian bị hạn chế, hãy nhớ rằng thời gian của nó bị hạn chế, vì vậy việc biết mẫu sẽ cho phép bạn tập trung giải quyết vấn đề và trao đổi với người phỏng vấn về quá trình suy nghĩ của bạn
  • Một số thuật toán có thể trông dễ dàng, nhưng thực sự khó thực hiện chính xác do các trường hợp ranh giới/cạnh khác nhau [chẳng hạn như tìm kiếm nhị phân], do đó, biết một mẫu sẽ cho phép bạn viết một số mã không có lỗi dễ dàng hơn
  • Các mẫu được tổng hợp từ việc giải nhiều bài toán nên việc học từ các mẫu sẽ dễ dàng và hiệu quả hơn
  • Việc chọn và chuẩn bị cho cuộc phỏng vấn cũng dễ dàng hơn nếu bạn chưa có cuộc phỏng vấn nào trong hơn một năm khi bạn có một số mẫu
  • Một số thuật toán khó thực hiện hoặc ít nhất là thực hiện tốt. Có một mẫu tốt sẽ làm cho mã của bạn trông đẹp hơn nhiều
  • Mẫu là lý do chính cho repo này. ]

A1. 1. 6 Mất tự tin khi tập leetcode thì phải làm sao

Tôi biết nó có thể cực kỳ khó chịu khi bạn lần đầu tiên bắt đầu với các vấn đề về thuật toán và cấu trúc dữ liệu

Tôi đã ở đó và tôi biết nó cảm thấy như thế nào

Đây là những điều bạn phải biết

  • Bất kỳ thuật toán nào có tên, chúng không có nghĩa là bạn dễ dàng tìm ra. Kiểm tra các thuật toán trên wiki, bạn có thể xem lịch sử. Đây là lý do tại sao chúng ta cần mẫu và tại sao chúng ta cần nghiên cứu chúng
  • Hãy nghĩ về các thuật toán và cấu trúc dữ liệu như một khóa học toán và cuộc phỏng vấn là một bài kiểm tra cuối kỳ. Bạn cần học công thức [i. e. từng thuật toán và cấu trúc dữ liệu] từng cái một và phỏng vấn chỉ là một cách để kiểm tra một số trong số chúng. Lúc đầu không biết tất cả chúng cũng không sao, điều quan trọng là học chúng từng bước một
  • Xây dựng sự tự tin của bạn từng bước
    • đây là lý do tại sao bạn cần giải quyết các vấn đề dựa trên TAG và giải quyết chúng từ dễ đến khó
    • biết một mẫu, vì vậy bạn có thể bắt đầu lập trình ít nhất
  • Bạn không đơn độc, tất cả chúng ta đều cảm thấy như vậy, vì vậy đừng lo lắng, hãy tiếp tục làm việc

Bạn cũng nên tham khảo các câu hỏi QA khác để biết thêm chi tiết

A1. 1. 7 Tôi vẫn không thể giải quyết các vấn đề mới ngay cả khi tôi đã hoàn thành x số vấn đề trên LeetCode

Đây có thể là một điều phổ biến và điều đó có nghĩa là bạn đã không sử dụng Leetcode hiệu quả và hiệu quả

Về cơ bản, bạn nên tham khảo các câu hỏi QA khác để biết thêm chi tiết

Đây là một bản tóm tắt ngắn

  • Ghi chú về vấn đề bạn đã giải quyết và xem lại chúng sau
  • Bạn có thể giải quyết cùng một vấn đề nhiều lần trong những thời điểm khác nhau, sau tất cả, thực hành sẽ giúp bạn hoàn thiện
  • LẠI, giải quyết vấn đề bằng thẻ, vì vậy bạn có thể thành thạo một loại tại một thời điểm
  • Bắt đầu với các mẫu và vượt ra ngoài các mẫu để bạn có thể giải quyết các vấn đề hơi khác nhau nhưng trong cùng một danh mục
  • Khi bạn đã quen thuộc với các thuật toán và cấu trúc dữ liệu cơ bản, các vấn đề trung bình và khó và chỉ cần kết hợp hai hoặc ba thuật toán/cấu trúc dữ liệu

A1. 2 câu hỏi phỏng vấn

A1. 2. 1 Quy trình phỏng vấn diễn ra như thế nào

Quá trình phỏng vấn thường theo các bước sau, nhưng tất nhiên mỗi công ty là khác nhau

  1. Bạn sẽ nhận được email yêu cầu bạn hoàn thành bài kiểm tra Đánh giá trực tuyến [OA], thường là các câu hỏi về thuật toán hoặc bài kiểm tra kiến ​​thức đơn giản cho nhóm công nghệ của công ty
    • Lưu ý điều này chủ yếu được sử dụng bởi các công ty lớn [và một số công ty cỡ trung bình]. Các công ty nhỏ hiếm khi có nó
  2. Bạn đã được công ty liên hệ rằng sẽ có một cuộc phỏng vấn qua điện thoại
    • Bước này thông thường chỉ là nói về bản thân bạn và xem sơ yếu lý lịch/kinh nghiệm của bạn, đồng thời tìm hiểu thêm về công ty và vị trí
  3. Một cuộc phỏng vấn qua điện thoại kỹ thuật
    • Đây có thể là bất cứ điều gì, từ các câu hỏi về thuật toán, đến các tính năng ngôn ngữ/khung
    • Mỗi công ty là khác nhau
  4. Một vòng phỏng vấn kỹ thuật khác qua điện thoại hoặc làm bài kiểm tra/dự án về nhà
    • Nếu đây không phải là một bài kiểm tra/dự án mang về nhà, thì nó được gọi là "Tại chỗ", nơi bạn dành nhiều giờ để hoàn thành nhiều vòng phỏng vấn [3-5 vòng tùy thuộc vào công ty và mức độ kinh nghiệm]
  5. Bước này khác nhau, có thể là một cuộc phỏng vấn kỹ thuật khác hoặc cuộc phỏng vấn văn hóa công ty
    • Một lần nữa, không phải tất cả các công ty đều có bước này, nhưng nếu bạn có một bước thì chủ yếu chỉ để kiểm tra ứng viên về văn hóa công ty hoặc một số cuộc thảo luận kỹ thuật mở cấp cao
  6. Phục vụ

Các bước trên chỉ là một bản tóm tắt từ kinh nghiệm của riêng tôi [và từ những gì tôi học được từ bạn bè của mình]

HÃY hỏi người phỏng vấn/giờ quá trình phỏng vấn khi bạn được liên lạc

A1. 2. 2 Cách viết sơ yếu lý lịch hiệu quả

Chà, đó là tất cả về số năm kinh nghiệm [YOE]. Dưới đây là một số lời khuyên bạn nên biết

  • Nếu bạn có ít kinh nghiệm hơn, bạn nên giữ sơ yếu lý lịch của mình trong 1 trang. Nếu bạn có nhiều kinh nghiệm thì nên để trong 2 trang. chỉ cần không đi qua hai trang
  • Bạn có thể biết thêm chi tiết trong trải nghiệm gần đây hơn và ít chi tiết hơn trong trải nghiệm đầu năm
  • Hãy thử điều chỉnh sơ yếu lý lịch của bạn theo các yêu cầu đăng tuyển, đặc biệt đảm bảo rằng bạn có các TỪ KHÓA phù hợp với đăng tuyển
  • Hãy chắc chắn rằng bạn nhấn mạnh những gì BẠN đã làm và đóng góp của BẠN cho các dự án được liệt kê
  • Tôi biết nó thường khó, nhưng hãy thử đưa ra những con số phân tích cụ thể [tôi. e. cải thiện hiệu suất 200%]
  • Làm nổi bật các kỹ năng và thành tích của bạn
  • KIỂM TRA ĐÔI CHÍNH TẢ VÀ NGỮ PHÁP, nhờ người khác đọc lại cho bạn

A1. 2. 3 Tôi đã nộp đơn cho nhiều công việc nhưng vẫn không có cuộc phỏng vấn nào

  • Nếu bạn là sinh viên mới tốt nghiệp, điều này là phổ biến. Sinh viên mới ra trường khó tìm việc ở bất kỳ ngành nào. Lời khuyên của tôi là hãy viết sơ yếu lý lịch của bạn càng nhiều càng tốt, đảm bảo rằng mỗi sơ yếu lý lịch đều được nhắm mục tiêu đến vị trí đăng tuyển thật tốt, hãy viết thư xin việc để thể hiện thêm sự nhiệt tình của bạn đối với công việc và tiếp tục ứng tuyển.
  • Nếu bạn có một vài năm kinh nghiệm, hãy chắc chắn rằng sơ yếu lý lịch của bạn thật tuyệt vời
    • Đảm bảo sơ yếu lý lịch của bạn được cập nhật, không có lỗi chính tả và ngữ pháp ngớ ngẩn
    • Đảm bảo rằng bạn đã tập trung vào những đóng góp của mình trong sơ yếu lý lịch
    • Hãy chắc chắn rằng bạn đã làm nổi bật các kỹ năng và thành tích của mình
    • Có thể tìm một dịch vụ chuyên nghiệp để giúp bạn hoàn thiện sơ yếu lý lịch nếu nó vẫn chưa bóng bẩy như bạn muốn
    • cứ ứng tuyển đi, biết đâu có cơ hội tốt đang đợi mình

A1. 2. 4 Cách giải quyết vấn đề về thuật toán/cấu trúc dữ liệu khi phỏng vấn

Trong các QA khác, tôi đã giải thích cách mài Leetcode hiệu quả và hiệu quả

Với đủ thực hành, bạn đã có một cuộc phỏng vấn, đây là một số mẹo có thể tăng tỷ lệ thành công của bạn

  • Hãy chắc chắn rằng bạn yêu cầu làm rõ ngay từ đầu. Đầu vào là gì, loại đầu vào, cái gì được đưa ra, cái gì sẽ là đầu ra, v.v.
  • Trước khi viết code, HÃY SUY NGHĨ RÕ
    • Thảo luận về quá trình suy nghĩ của bạn với người phỏng vấn
    • bạn chọn cấu trúc dữ liệu nào, tại sao bạn chọn chúng, các bước để thực hiện là gì
    • Trong quá trình này, hãy viết chúng ra. Ví dụ: viết chúng dưới dạng nhận xét, từng bước một
  • Khi người phỏng vấn biết suy nghĩ của bạn, hãy hỏi xem viết mã có ổn không, sau đó viết mã. Đôi khi bạn thậm chí có thể bỏ qua mã hóa hoàn toàn
  • Sẵn sàng thảo luận về sự phức tạp về thời gian và không gian
  • Hãy sẵn sàng cho các câu hỏi tiếp theo

A1. 3 câu hỏi chung

A1. 3. 1 Công ty lớn VS Công ty nhỏ

Các công ty lớn như "Big Five" [Google, Amazon, Facebook, Apple, Microsoft] hay FAANG [Facebook, Amazon, Apple, Netflix, Google] rất hấp dẫn các nhà phát triển, nhưng cũng có nhiều công ty nhỏ hơn và các công ty khởi nghiệp.

Ngoài ra còn có FAANGMULA hoặc FAANGULTAD, hãy tra cứu chúng

Cuộc tranh luận về việc làm việc cho một công ty lớn hay một công ty nhỏ đang diễn ra và có lẽ sẽ không bao giờ dừng lại, vì chúng có thể khá khác nhau

Kết luận ngắn gọn là

  • Công ty lớn
    • Công ty lớn là một nền tảng lớn, nơi bạn có thể xây dựng mạng của mình rất hiệu quả và hiểu rõ hơn về cách thức hoạt động của công ty lớn và kiến ​​trúc phức tạp,
    • các công ty lớn có kho công nghệ của riêng họ mà bạn sẽ phải học và không thể sử dụng chúng ở nơi khác, vì vậy điều quan trọng là phải biết cách chúng hoạt động bí mật
    • mặt trái là có thể có quản lý vi mô và chính trị văn phòng [ít nhất là ở một mức độ nào đó], rất khó để tìm hiểu chu trình phát triển đầy đủ, quy trình phát triển phần mềm có thể dài và rườm rà, và quảng cáo có thể mất nhiều thời gian nhưng có lộ trình rõ ràng
  • Công ty nhỏ
    • công ty nhỏ cho phép bạn tìm hiểu toàn bộ chu trình phát triển, thu được nhiều kinh nghiệm dự án một cách nhanh chóng và phát hành một sản phẩm hoàn chỉnh từ ý tưởng đến sản xuất
    • Bạn sẽ dành phần lớn thời gian để viết mã và xem lại mã, vì vậy chu kỳ phát triển và vận chuyển khá nhanh
    • các công ty nhỏ chủ yếu sử dụng các công cụ nguồn mở và thường xuyên cập nhật ngăn xếp công nghệ với các công nghệ mới nhất
    • phạm vi của các dự án có thể nhỏ hơn và thăng tiến có thể nhanh hơn, nhưng con đường sự nghiệp có thể không rõ ràng lắm
    • Mặt trái là công ty của bạn không được nhiều người biết đến nên kỹ năng của bạn có thể bị nghi ngờ, việc xây dựng các mối quan hệ khó khăn hơn một chút, cấu trúc và quy trình của công ty có thể hỗn loạn trong một khoảng thời gian.

Tôi đã tạo một bảng cho bạn. [Đó là chủ quan và tùy đội khác nhau, con số không chính xác nhưng để các bạn tham khảo]

Công ty lớn Công ty nhỏ Kết nối mạng Dễ dàng kết nối với những người tài năng cao Phải làm việc trên mạng Lập trình [thay đổi theo các công ty khác nhau] ít hơn Quy trình phát hành tính năng có thể có nhiều vòng đánh giá và quy trình phê duyệt thông thường chỉ là đánh giá ngang hàng Ngăn xếp công nghệ phụ thuộc vào các nhóm khác nhau, nhiều công cụ nội bộ phụ thuộc vào dự án và văn hóa công ty, thường xuyên

A1. 3. 2 How to get your FIRST job. [Làm thế nào để trở nên cạnh tranh hơn giữa các ứng viên]

Để bắt đầu, điều này không chỉ giới hạn ở việc làm thế nào để có được công việc đầu tiên, mà còn nhằm chỉ cho bạn cách nổi bật giữa đám đông

quy tắc ngón tay cái. xây dựng danh tiếng của bạn, có thêm kinh nghiệm dự án, kết nối mạng

Về cơ bản, bạn sẽ cần xây dựng danh tiếng của mình. Làm thế nào để làm điều đó?

  • tham dự các buổi họp mặt. Đầu tiên và hầu hết

    • Các cuộc gặp gỡ, đặc biệt là các cuộc gặp gỡ tại địa phương mang đến cho bạn cơ hội nói chuyện trực tiếp với một người đang có việc làm và công ty của họ có thể đang tuyển dụng. Vì vậy, nếu bạn thường xuyên đi gặp gỡ và kết nối, cơ hội việc làm sẽ đến với bạn
  • Đảm bảo rằng bạn tiếp tục và hồ sơ LinkedIn [đặc biệt là hồ sơ này. ] được cập nhật

    • Các nhà tuyển dụng và đại lý hoạt động khá tích cực trên LinkedIn và tôi đã nhận được rất nhiều sự quan tâm từ họ
  • Có thêm kinh nghiệm dự án. Đóng góp cho dự án nguồn mở hoặc tạo dự án cá nhân của riêng bạn

    • Điều này không chỉ dành cho sinh viên mới ra trường mà còn dành cho những bạn đã có vài năm kinh nghiệm nhưng chưa có dự án nào để trình bày.
    • Tôi chắc rằng tất cả các bạn đều có nhiều kinh nghiệm dự án từ công việc, nhưng tôi e rằng bạn không thể cho người phỏng vấn thấy chúng. Dự án cá nhân là một cách để THỂ HIỆN các kỹ năng và mật mã của bạn, đồng thời là một cách để thuyết phục bộ phận nhân sự/người phỏng vấn rằng bạn là một ứng cử viên sáng giá
    • GHI CHÚ. hầu hết thời gian HR/người phỏng vấn sẽ không xem xét dự án thú vị của bạn, nhưng bạn vẫn có thể cho họ biết và có thể khoe khoang về nó trong cuộc phỏng vấn của bạn, điều đó sẽ luôn ghi điểm
    • Cuối cùng, hãy đảm bảo rằng dự án thú cưng của bạn có mã chất lượng và tuân theo các tiêu chuẩn. Nếu không nó sẽ không giúp được gì
  • Ứng tuyển vào nhiều công việc và đừng ngại nhờ giúp đỡ

    • Đừng hạn chế bản thân. Đối với công việc đầu tiên, hãy chắc chắn rằng bạn đã chuẩn bị đầy đủ và nộp đơn vào tất cả các công ty mà bạn có thể nộp đơn, đừng giới hạn bản thân chỉ ở những công ty lớn hoặc một số công ty nhất định. Rốt cuộc, khi bạn đã có công việc đầu tiên, sẽ dễ dàng tìm được công việc thứ hai, thứ ba, v.v.
    • Hỏi mạng của bạn về các cơ hội việc làm tiềm năng. Đừng ngại hỏi xung quanh, nhưng hãy chắc chắn rằng bạn lịch sự và không quấy rối mọi người. Hỏi không hại gì và đôi khi kết quả có thể làm bạn ngạc nhiên
  • Đừng bỏ cuộc. Nếu bạn không thể tìm được việc làm hoặc thậm chí không nhận được bất kỳ phản hồi nào, thì đó không phải là lỗi của bạn

    • Hầu hết các công ty sẽ không phản hồi nếu ngày nay bạn không phải là người phù hợp. Tôi biết điều đó không tốt chút nào và bạn cảm thấy như mình đang treo lơ lửng ở đó, nhưng hãy lưu ý rằng đó không phải là lỗi của bạn

Rất nhiều khi tìm được việc làm là may mắn hơn bất cứ điều gì khác, vì vậy hãy chuẩn bị sẵn sàng, kiên nhẫn và đừng bỏ cuộc

Chúc may mắn

Phụ lục 2. Tài nguyên

A2. 1 kinh nghiệm học tập

  • Mọi thứ về Python — Sơ cấp đến Nâng cao
  • Đại học phỏng vấn lập trình
  • GitHub - TheAlgorithms/Python. Tất cả các thuật toán được triển khai trong Python
  • VisuAlgo - trực quan hóa cấu trúc dữ liệu và thuật toán thông qua hình ảnh động

A2. 1. 1 khóa học MOOC trực tuyến

  • CS 61A. Cấu trúc và giải thích các chương trình máy tính
  • CS 61B. Cấu trúc dữ liệu Mùa xuân 2019
  • CS61C. Kiến trúc máy tính [Cấu trúc máy]
  • MIT6. 046. Thiết kế và phân tích thuật toán
  • MIT6. 824. Hệ thống phân phối

A2. 2 Cách giải các câu hỏi thuật toán

  • Fucking Algorithm - Mẫu thuật toán - Java, Python - Tiếng Anh, Tiếng Trung
  • Algorithm Pattern - Mẫu thuật toán - Go - Chinese
  • Hello Algorithm - Leetcode Solution - Java - Tiếng Anh, Tiếng Trung
  • LeetCode Topics and Interview Questions Collection - Leetcode Solution - Java - English, Chinese
  • BẢNG XẾP HẠNG. CÁC MẪU LEETCODE THÔNG DỤNG & CÁC VẤN ĐỀ THƯỜNG GẶP VỀ LEETCODE - Tiếng Anh
  • LeetCode 101 - Hướng dẫn mài LeetCode [Phiên bản C++] - Tiếng Trung

A2. 3 OOD [Thiết kế hướng đối tượng]

A2. 3. 1 nguyên tắc RẮN

  • S. O. L. I. D. Nguyên tắc thiết kế hướng đối tượng - Hướng dẫn về thiết kế hướng đối tượng
  • Hiểu Nguyên tắc Trách nhiệm Đơn lẻ
  • Hiểu nguyên tắc đóng mở
  • Hiểu nguyên tắc thay thế Liskov
  • Nguyên tắc thiết kế OOP. Nguyên tắc phân tách giao diện
  • Nguyên tắc thiết kế OOP. Nguyên tắc đảo ngược phụ thuộc
  • Tái cấu trúc từ Trash thành SOLID

A2. 3. 2 Clean Code - Bài học của chú Bob

Chú Bob, một kỹ sư phần mềm và đã giới thiệu S. O. L. I. D. hiệu trưởng để viết mã sạch

Đây là loạt bài nói chuyện cởi mở gần đây của anh ấy và tôi cảm thấy thật đáng giá nếu dành thời gian xem chúng ít nhất một lần

Nếu bạn không muốn đọc cuốn sách, ít nhất bạn nên xem bộ truyện này

  • Clean Code - Chú Bob / Bài học 1. Nguyên tắc SOLID, tái cấu trúc, DRY
  • Clean Code - Chú Bob / Bài 2. Nhận xét, tài liệu, đặt tên, đánh giá
  • Clean Code - Chú Bob / Bài 3. Phát triển phần mềm, QA, làm việc theo nhóm
  • Clean Code - Chú Bob / Bài 4. TDD
  • Clean Code - Chú Bob / Bài 5. Kiến trúc, phát triển dự án
  • Clean Code - Chú Bob / Bài 6. quản lý dự án

A2. 4 mẫu thiết kế

  • mẫu thiết kế
    • Cuối cùng, tất cả các bạn cần học các mẫu thiết kế
  • Các mẫu thiết kế trong Python

A2. 5 Không đồng bộ trong Python

  • Làm sáng tỏ từ khóa Async và Await của Python
  • Suy nghĩ bên ngoài GIL với AsyncIO và Đa xử lý - PyCon 2018
  • Không đồng bộ nâng cao. Giải quyết các vấn đề sản xuất trong thế giới thực - PyCon 2019

A2. 6 Thiết kế hệ thống

  • Phỏng Vấn Thiết Kế Hệ Thống
    • PHẢI xem kỹ lưỡng, được giải thích cặn kẽ bởi một kỹ sư cấp cao của Amazon, đây là những gì bạn nên mong đợi trong một cuộc phỏng vấn
  • Cơ sở thiết kế hệ thống
    • Repo với lời giải thích, ví dụ và trường hợp nghiên cứu
  • Hệ thống phân tán cho niềm vui và lợi nhuận
    • Khoảng 100 trang sách miễn phí
  • Bảng thiết kế hệ thống
  • System Design Cheatsheet - Guvi - Medium
  • CheatSheet. Thiết Kế Hệ Thống Cho Phỏng Vấn Việc Làm – CheatSheet
  • GitHub - puncsky/thiết kế và kiến ​​trúc hệ thống. Tìm hiểu cách thiết kế hệ thống quy mô lớn. Chuẩn bị cho cuộc phỏng vấn thiết kế hệ thống
  • GitHub - checkcheckzz/phỏng vấn-thiết kế hệ thống. Phỏng vấn thiết kế hệ thống cho công ty IT
  • Mạng trình duyệt hiệu suất cao [O'Reilly]
  • GitHub - binhnguyennus/scalability tuyệt vời. Mô hình của các hệ thống quy mô lớn có thể mở rộng, đáng tin cậy và hiệu quả
  • Kiến trúc của các ứng dụng mã nguồn mở [Tập 2]. Kiến trúc web có thể mở rộng và hệ thống phân tán

Repo này có danh sách đầy đủ các blog kỹ thuật của công ty

  • Blog kỹ thuật

giấy tờ

  • Google MapGiảm. Xử lý dữ liệu đơn giản hóa trên các cụm lớn
  • Hệ thống tệp của Google
  • TẠO. Kho lưu trữ dữ liệu phân tán của Facebook dành cho đồ thị xã hội
  • máy phát điện. Cửa hàng khóa-giá trị có sẵn cao của Amazon

A2. 7 Máy học

  • 100 ngày viết mã máy học

A2. 8 Học tăng cường

  • Phương pháp và hướng dẫn học tăng cường

mặt hậu

Nội dung kết thúc ở đây, nhưng học hỏi không bao giờ dừng lại

Nếu bạn thích nội dung của tôi, vui lòng đánh dấu sao/thích/rẽ nhánh trên github

Đây là trang bảo trợ của tôi, mọi hỗ trợ đều được đánh giá cao và sẽ thúc đẩy tôi rất nhiều trong việc tạo ra nhiều nội dung hơn

Chủ Đề