Hướng dẫn javascript for technical interviews - javascript cho các cuộc phỏng vấn kỹ thuật

Tốt nghiệp khá sớm và có một vài cuộc phỏng vấn mã hóa sắp tới.

Show

Nội dung chính ShowShow

  • Tôi có nên tiếp tục và sử dụng JavaScript để thực hành DS+Algo để chuẩn bị các cuộc phỏng vấn việc làm không?
  • Chọn một ngôn ngữ lập trình
  • Xem lại CS101 của bạn
  • Làm chủ thông qua thực hành
  • Các giai đoạn của một cuộc phỏng vấn mã hóa
  • Chuẩn bị cho một cuộc phỏng vấn từ xa
  • Phải làm gì khi bạn nhận được câu hỏi
  • Bắt đầu mã
  • Sau khi mã hóa
  • Thực hành với các cuộc phỏng vấn giả
  • Đi ra ngoài và chinh phục
  • Mẹo thực tế cho các câu hỏi mã hóa
  • Mẹo chung
  • Sự phối hợp
  • Nhị phân
  • Subarray sản phẩm tối đa
  • Bit, byte, xây dựng với nhị phân
  • Đối với các câu hỏi trong đó việc tổng kết hoặc nhân của Subarray có liên quan, tính toán trước bằng cách sử dụng băm hoặc tiền tố, tổng hậu tố hoặc sản phẩm có thể hữu ích.
  • Khoảng thời gian
  • Số đảo
  • Số lượng các thành phần được kết nối trong một biểu đồ không mong muốn
  • Một ma trận là một mảng 2 chiều. Các câu hỏi liên quan đến ma trận thường liên quan đến lập trình động hoặc chuyển đổi đồ thị.
  • Cây nhị phân
  • Cây tìm kiếm nhị phân (BST)
  • Liên kết nghiên cứu
  • Khi sử dụng đệ quy, luôn luôn nhớ kiểm tra trường hợp cơ sở, thường là nơi nút là rows, cols = len(matrix), len(matrix[0]) copy = [[0 for _ in range(cols)] for _ in range(rows)8.
  • Mã hóa và giải mã chuỗi
  • Ngôn ngữ nào là tốt nhất để phỏng vấn mã hóa?
  • Tôi có thể sử dụng JS cho cuộc phỏng vấn của Amazon không?
  • Tôi nên phỏng vấn bằng Python hay JavaScript?
  • Tôi có thể trả lời phỏng vấn DSA trong JavaScript không?

Tôi chắc chắn cảm thấy thoải mái nhất với JS vì đó là ngôn ngữ mà tôi đã dành nhiều thời gian nhất, nhưng không chắc đây có phải là ngôn ngữ tốt nhất để sử dụng cho các cuộc phỏng vấn mã hóa hay không. Tôi có một số kinh nghiệm với Java và Python nhưng tôi không thành thạo họ như trong JS.

Vì tôi có một vài tháng, tôi rất sẵn lòng đi sâu vào bất kỳ ngôn ngữ nào khác nếu cần thiết. Các bạn có thể chia sẻ kinh nghiệm hoặc suy nghĩ cá nhân của bạn với các cuộc phỏng vấn mã hóa / OAS với JS không?

Hướng dẫn javascript for technical interviews - javascript cho các cuộc phỏng vấn kỹ thuật

Xin chào, tôi cần một số gợi ý từ cộng đồng này-

Bây giờ tôi đang ở năm cuối và sẽ bắt đầu chuẩn bị cho các cuộc phỏng vấn xin việc. Tôi về cơ bản bắt đầu thực hành các cấu trúc dữ liệu và thuật toán.

Tôi là một nhà phát triển Stack đầy đủ chuyên về phát triển Frontend (React).

Tôi sẽ nhắm mục tiêu vai trò nhà phát triển Full Stack (MERN) cho sự nghiệp của tôi.

Tôi biết hầu hết mọi người sử dụng C ++/Java/Python để thực hiện DS+Algo nhưng vì tôi đang nhắm mục tiêu vai trò nhà phát triển Stack đầy đủ, tôi nghĩ đến việc sử dụng

def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
0 để làm điều tương tự.

Tôi không nghĩ rằng sử dụng C ++ sẽ từ chối tôi vì tôi sẽ sử dụng JS cho công việc hàng ngày của mình.

Vì vậy, đây là câu hỏi của tôi-

Tôi có nên tiếp tục và sử dụng JavaScript để thực hành DS+Algo để chuẩn bị các cuộc phỏng vấn việc làm không?

Bất kỳ đề xuất/mẹo/tài nguyên nào sẽ được đánh giá cao 🙂

Xin đừng ngần ngại thảo luận/chia sẻ ý kiến/kinh nghiệm của bạn. Nó sẽ hữu ích cho tôi và những người khác có cùng một sự nhầm lẫn.

Tóm lại, để làm tốt trong các cuộc phỏng vấn mã hóa:

Quyết định ngôn ngữ lập trình

Nghiên cứu các nguyên tắc cơ bản CS

Do đó, tôi đã dành ba tháng qua để tìm ra cách cải thiện kỹ năng phỏng vấn mã hóa của mình và cuối cùng nhận được lời đề nghị từ các công ty công nghệ lớn như Google, Facebook, Airbnb, Lyft, Dropbox và nhiều hơn nữa.Google, Facebook, Airbnb, Lyft, Dropbox and more. Google, Facebook, Airbnb, Lyft, Dropbox and more.

Trong bài đăng này, tôi sẽ chia sẻ những hiểu biết và mẹo tôi đạt được trên đường đi. Các ứng viên có kinh nghiệm cũng có thể mong đợi các câu hỏi thiết kế hệ thống, nhưng đó là phạm vi của bài đăng này.

Nhiều khái niệm thuật toán được thử nghiệm trong các cuộc phỏng vấn mã hóa không phải là những gì tôi thường sử dụng tại nơi làm việc, nơi tôi là một kỹ sư đầu tiên (Web). Đương nhiên, tôi đã quên khá nhiều về các thuật toán và cấu trúc dữ liệu này, điều mà tôi đã học được chủ yếu trong những năm thứ nhất và năm thứ hai của tôi.

Thật căng thẳng khi phải sản xuất mã (làm việc) trong một cuộc phỏng vấn, trong khi ai đó xem xét kỹ lưỡng mọi tổ hợp phím mà bạn thực hiện. Điều tồi tệ hơn là với tư cách là một người được phỏng vấn, bạn đã khuyến khích truyền đạt quá trình suy nghĩ của mình cho người phỏng vấn.

Tôi đã từng nghĩ rằng việc có thể suy nghĩ, viết mã và giao tiếp đồng thời là một kỳ công không thể, cho đến khi tôi nhận ra rằng hầu hết mọi người chỉ không giỏi trong các cuộc phỏng vấn khi họ bắt đầu. Phỏng vấn là một kỹ năng mà bạn có thể trở nên tốt hơn bằng cách nghiên cứu, chuẩn bị và thực hành cho nó.

Tìm kiếm công việc gần đây của tôi đã dẫn tôi vào hành trình cải thiện kỹ năng phỏng vấn mã hóa của tôi. Các kỹ sư trước thích nói về cách quá trình tuyển dụng hiện tại bị phá vỡ vì các cuộc phỏng vấn kỹ thuật có thể bao gồm các kỹ năng không liên quan đến phát triển mặt trước. Ví dụ, viết một thuật toán giải quyết mê cung và hợp nhất hai danh sách các số được sắp xếp. Là một kỹ sư đầu tiên, tôi có thể đồng cảm với họ.

Mặt trước là một miền chuyên dụng trong đó các kỹ sư phải quan tâm đến nhiều vấn đề liên quan đến tính tương thích của trình duyệt, mô hình đối tượng tài liệu, hiệu suất JavaScript, bố cục CSS, v.v. Không phổ biến đối với các kỹ sư mặt trước để thực hiện một số thuật toán phức tạp được thử nghiệm trong các cuộc phỏng vấn.

Tại các công ty như Facebook và Google, People là những kỹ sư phần mềm đầu tiên, các chuyên gia tên miền thứ hai.

Thật không may, các quy tắc được đặt ra bởi các công ty, không phải các ứng cử viên. Có một sự nhấn mạnh cao về các khái niệm khoa học máy tính nói chung như thuật toán, mẫu thiết kế, cấu trúc dữ liệu; Kỹ năng cốt lõi mà một kỹ sư phần mềm tốt nên sở hữu. Nếu bạn muốn công việc, bạn phải chơi theo các quy tắc do các bậc thầy trò chơi đặt ra - cải thiện kỹ năng phỏng vấn mã hóa của bạn!

Bài này được cấu trúc thành hai phần sau. Hãy thoải mái bỏ qua phần mà bạn quan tâm.

  • Sự cố của các cuộc phỏng vấn mã hóa, và làm thế nào để chuẩn bị cho họ.
  • Các mẹo và gợi ý hữu ích cho từng chủ đề thuật toán (mảng, cây, lập trình động, v.v.), cùng với các câu hỏi thực hành LeetCode được đề xuất để xem xét các khái niệm cốt lõi và để cải thiện các chủ đề đó.

Nội dung cho bài viết này có thể được tìm thấy ở đây. Tôi sẽ cập nhật ở đó khi cần thiết.

Nếu bạn quan tâm đến nội dung trước, hãy xem Sổ tay phỏng vấn trước của tôi ở đây.

Chọn một ngôn ngữ lập trình

Trước bất cứ điều gì khác, bạn cần chọn một ngôn ngữ lập trình cho cuộc phỏng vấn mã hóa thuật toán của bạn.

Hầu hết các công ty sẽ cho phép bạn viết mã bằng ngôn ngữ bạn chọn. Ngoại lệ duy nhất tôi biết là Google. Họ cho phép các ứng cử viên của họ chỉ chọn từ Java, C ++, Python, Go hoặc JavaScript.

Đối với hầu hết các phần, tôi khuyên bạn nên sử dụng một ngôn ngữ mà bạn cực kỳ quen thuộc, thay vì ngôn ngữ mới đối với bạn nhưng công ty sử dụng rộng rãi.

Có một số ngôn ngữ phù hợp hơn các ngôn ngữ khác để phỏng vấn mã hóa. Sau đó, có một số mà bạn hoàn toàn muốn tránh.

Từ kinh nghiệm của tôi với tư cách là một người phỏng vấn, hầu hết các ứng cử viên chọn Python hoặc Java. Các ngôn ngữ khác thường được chọn bao gồm JavaScript, Ruby và C ++. Tôi hoàn toàn sẽ tránh các ngôn ngữ cấp thấp hơn như C hoặc GO, đơn giản vì chúng thiếu các hàm thư viện tiêu chuẩn và cấu trúc dữ liệu.

Cá nhân, Python là lựa chọn thực tế của tôi cho các thuật toán mã hóa trong các cuộc phỏng vấn. Nó ngắn gọn và có một thư viện lớn các chức năng và cấu trúc dữ liệu.

Một trong những lý do hàng đầu tôi đề nghị Python là nó sử dụng API nhất quán hoạt động trên các cấu trúc dữ liệu khác nhau, chẳng hạn như

def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
1,
def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
2 và ký hiệu cắt trên các chuỗi (chuỗi, danh sách và bộ dữ liệu). Nhận phần tử cuối cùng trong một chuỗi là
def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
3 và đảo ngược nó chỉ đơn giản là
def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
4. Bạn có thể đạt được rất nhiều với cú pháp tối thiểu trong Python.

Java cũng là một lựa chọn tốt. Nhưng bởi vì bạn sẽ phải liên tục khai báo các loại trong mã của mình, điều đó có nghĩa là nhập thêm phím phím. Điều này sẽ làm chậm tốc độ mà bạn mã và nhập. Vấn đề này sẽ rõ ràng hơn khi bạn phải viết trên bảng trắng trong các cuộc phỏng vấn tại chỗ.

Những lý do để chọn hoặc không chọn C ++ tương tự như Java. Cuối cùng, Python, Java và C ++ là những lựa chọn tốt. Nếu bạn đã sử dụng Java một thời gian và không có thời gian để làm quen với một ngôn ngữ khác, tôi khuyên bạn nên gắn bó với Java thay vì nhặt Python từ đầu. Điều này giúp bạn tránh phải sử dụng một ngôn ngữ cho công việc và một ngôn ngữ khác để phỏng vấn. Hầu hết thời gian, nút cổ chai là trong suy nghĩ và không phải là văn bản.

Một ngoại lệ đối với quy ước cho phép ứng viên chọn bất kỳ ngôn ngữ lập trình nào mà họ muốn là khi cuộc phỏng vấn dành cho vị trí dành riêng cho miền, chẳng hạn như các vai trò của Front-end, iOS hoặc Android Engineer. Bạn cần phải làm quen với các thuật toán mã hóa trong JavaScript, Objective-C, Swift và Java, tương ứng.

Nếu bạn cần sử dụng cấu trúc dữ liệu mà ngôn ngữ không hỗ trợ, chẳng hạn như hàng đợi hoặc đống trong JavaScript, hãy hỏi người phỏng vấn nếu bạn có thể cho rằng bạn có cấu trúc dữ liệu thực hiện các phương pháp nhất định với độ phức tạp thời gian được chỉ định. Nếu việc thực hiện cấu trúc dữ liệu đó không quan trọng để giải quyết vấn đề, người phỏng vấn thường sẽ cho phép nó.

Trong thực tế, nhận thức được các cấu trúc dữ liệu hiện có và lựa chọn các cấu trúc thích hợp để giải quyết vấn đề trong tay là quan trọng hơn là biết các chi tiết thực hiện phức tạp.

Xem lại CS101 của bạn

Nếu bạn đã ra khỏi trường đại học một thời gian, rất nên xem xét các nguyên tắc cơ bản của CS. Tôi thích xem lại nó khi tôi thực hành. Tôi quét qua các ghi chú của mình từ trường đại học và sửa đổi các thuật toán khác nhau khi tôi làm việc về các vấn đề thuật toán từ LeetCode và phá vỡ cuộc phỏng vấn mã hóa.

Nếu bạn quan tâm đến cách các cấu trúc dữ liệu được triển khai, hãy xem Lago, một kho lưu trữ GitHub chứa các cấu trúc dữ liệu và các ví dụ thuật toán trong JavaScript.

GitHub - Yangshun/Lago: 📕 Cấu trúc dữ liệu và thư viện thuật toán trong TypeScript

Cấu trúc dữ liệu và thư viện thuật toán trong TypeScript - GitHub - Yangshun/Lago: 📕 Cấu trúc dữ liệu và thư viện thuật toán trong TypeScript

YangshungithubGitHubGitHub

Làm chủ thông qua thực hành

Tiếp theo, có được sự quen thuộc và làm chủ các thuật toán và cấu trúc dữ liệu trong ngôn ngữ lập trình đã chọn của bạn.

Thực hành và giải quyết các câu hỏi thuật toán bằng ngôn ngữ đã chọn của bạn. Trong khi bẻ khóa cuộc phỏng vấn mã hóa là một tài nguyên tốt, tôi thích giải quyết các vấn đề bằng cách gõ mã, để nó chạy và nhận phản hồi tức thì.

Có nhiều thẩm phán trực tuyến khác nhau, chẳng hạn như LeetCode, Hackerrank và CodeForces để bạn thực hành các câu hỏi trực tuyến và làm quen với ngôn ngữ. Từ kinh nghiệm của tôi, các câu hỏi Leetcode tương tự như các câu hỏi được hỏi trong các cuộc phỏng vấn. Các câu hỏi của HackerRank và CodeForces giống với các câu hỏi trong chương trình cạnh tranh.

Nếu bạn thực hành đủ các câu hỏi LeetCode, có một cơ hội tốt là bạn sẽ thấy hoặc hoàn thành một trong những câu hỏi phỏng vấn thực tế của bạn (hoặc một số biến thể của nó).

Tìm hiểu và hiểu sự phức tạp về thời gian và không gian của các hoạt động chung trong ngôn ngữ đã chọn của bạn. Đối với Python, trang này sẽ có ích. Ngoài ra, hãy tìm hiểu về thuật toán sắp xếp cơ bản đang được sử dụng trong hàm ngôn ngữ ____ ____10 và độ phức tạp về thời gian và không gian của nó (trong Python It Lốc Timsort, là một lai tạo).

Sau khi hoàn thành một câu hỏi trên LeetCode, tôi thường thêm độ phức tạp về thời gian và không gian của mã bằng văn bản dưới dạng nhận xét trên cơ thể chức năng. Tôi sử dụng các ý kiến ​​để nhắc nhở bản thân để truyền đạt phân tích thuật toán sau khi tôi hoàn thành việc thực hiện.

Đọc về phong cách mã hóa được đề xuất cho ngôn ngữ của bạn và gắn bó với nó. Nếu bạn chọn Python, hãy tham khảo Hướng dẫn kiểu PEP 8. Nếu bạn chọn Java, hãy tham khảo Hướng dẫn kiểu Java của Google.

Tìm hiểu về và quen thuộc với những cạm bẫy và cảnh báo ngôn ngữ phổ biến. Nếu bạn chỉ ra chúng trong cuộc phỏng vấn và tránh rơi vào họ, bạn sẽ kiếm được điểm thưởng và gây ấn tượng với người phỏng vấn, bất kể người phỏng vấn có quen thuộc với ngôn ngữ hay không.

Có được một tiếp xúc rộng rãi với các câu hỏi từ các chủ đề khác nhau. Trong nửa sau của bài viết, tôi đề cập đến các chủ đề thuật toán và các câu hỏi hữu ích cho mỗi chủ đề để thực hành. Thực hiện khoảng 100 đến 200 câu hỏi LeetCode, và bạn nên tốt.

Nếu bạn thích các khóa học trong đó việc học có cấu trúc hơn, đây là một vài khuyến nghị. Không có cách nào là tham gia các khóa học trực tuyến là phải để vượt qua các cuộc phỏng vấn.In no way is taking online courses a must in order to pass interviews.In no way is taking online courses a must in order to pass interviews.

  • Algomonster nhằm mục đích giúp bạn đánh giá cuộc phỏng vấn kỹ thuật trong thời gian ngắn nhất có thể. Theo Google Engineers, Algomonster sử dụng cách tiếp cận dựa trên dữ liệu để dạy cho bạn các mẫu câu hỏi chính hữu ích nhất và có nội dung để giúp bạn nhanh chóng sửa đổi các cấu trúc và thuật toán dữ liệu cơ bản. Trên hết, Algomonster không dựa trên đăng ký-trả phí một lần và truy cập trọn đời.in the shortest time possible. By Google engineers, AlgoMonster uses a data-driven approach to teach you the most useful key question patterns and has contents to help you quickly revise basic data structures and algorithms. Best of all, AlgoMonster is not subscription-based - pay a one-time fee and get lifetime access.in the shortest time possible. By Google engineers, AlgoMonster uses a data-driven approach to teach you the most useful key question patterns and has contents to help you quickly revise basic data structures and algorithms. Best of all, AlgoMonster is not subscription-based - pay a one-time fee and get lifetime access.
  • Grokking Cuộc phỏng vấn mã hóa: Các mẫu cho các câu hỏi mã hóa bằng cách mở rộng giáo dục về các câu hỏi thực hành được đề xuất trong bài viết này nhưng tiếp cận việc thực hành từ góc độ mẫu câu hỏi, đó là một cách tiếp cận mà tôi cũng đồng ý với việc học và đã sử dụng tốt hơn . Khóa học cho phép bạn thực hành các câu hỏi được chọn trong Java, Python, C ++, JavaScript và cũng cung cấp các giải pháp mẫu trong các ngôn ngữ đó. Tìm hiểu và hiểu các mẫu, không ghi nhớ câu trả lời.

Và tất nhiên, thực hành, thực hành, và thực hành nhiều hơn!

Các giai đoạn của một cuộc phỏng vấn mã hóa

Xin chúc mừng, bạn đã sẵn sàng để đặt các kỹ năng của mình để thực hành! Trong một cuộc phỏng vấn mã hóa, bạn sẽ được người phỏng vấn đưa ra một câu hỏi kỹ thuật. Bạn sẽ viết mã trong một trình soạn thảo hợp tác thời gian thực (màn hình điện thoại) hoặc trên bảng trắng (tại chỗ) và có 30 đến 45 phút để giải quyết vấn đề. Đây là nơi mà niềm vui thực sự bắt đầu!

Người phỏng vấn của bạn sẽ tìm cách thấy rằng bạn đáp ứng các yêu cầu của vai trò. Tùy thuộc vào bạn để cho họ thấy rằng bạn có các kỹ năng. Ban đầu, có thể cảm thấy kỳ lạ khi nói chuyện trong khi bạn viết mã, vì hầu hết các lập trình viên không tạo thói quen giải thích to suy nghĩ của họ trong khi họ đang gõ mã.

Tuy nhiên, thật khó để người phỏng vấn biết bạn đang nghĩ gì khi chỉ nhìn vào mã của bạn. Nếu bạn truyền đạt cách tiếp cận của bạn cho người phỏng vấn ngay cả trước khi bạn bắt đầu mã, bạn có thể xác thực cách tiếp cận của bạn với họ. Bằng cách này, hai bạn có thể đồng ý về một cách tiếp cận chấp nhận được.

Chuẩn bị cho một cuộc phỏng vấn từ xa

Đối với màn hình điện thoại và các cuộc phỏng vấn từ xa, có một tờ giấy và bút hoặc bút chì để ghi lại bất kỳ ghi chú hoặc sơ đồ nào. Nếu bạn được đưa ra một câu hỏi về cây và đồ thị, nó thường giúp nếu bạn vẽ các ví dụ về cấu trúc dữ liệu.

Sử dụng tai nghe. Hãy chắc chắn rằng bạn đang ở trong một môi trường yên tĩnh. Bạn không muốn cầm điện thoại bằng một tay và gõ vào tay kia. Cố gắng tránh sử dụng loa. Nếu phản hồi là xấu, giao tiếp được thực hiện khó khăn hơn. Phải lặp lại bản thân sẽ chỉ dẫn đến việc mất thời gian quý giá.

Phải làm gì khi bạn nhận được câu hỏi

Nhiều ứng cử viên bắt đầu mã hóa ngay khi họ nghe câu hỏi. Đó thường là một sai lầm lớn. Đầu tiên, hãy dành một chút thời gian và lặp lại câu hỏi cho người phỏng vấn để đảm bảo rằng bạn hiểu câu hỏi. Nếu bạn hiểu sai câu hỏi, thì người phỏng vấn có thể làm rõ.

Luôn luôn tìm kiếm sự làm rõ về câu hỏi khi nghe nó, ngay cả khi bạn nghĩ rằng nó rõ ràng. Bạn có thể phát hiện ra rằng bạn đã bỏ lỡ một cái gì đó. Nó cũng cho người phỏng vấn biết rằng bạn chú ý đến chi tiết.

Xem xét hỏi các câu hỏi sau.

  • Làm thế nào lớn là kích thước của đầu vào?
  • Làm thế nào lớn là phạm vi của các giá trị?
  • Có loại giá trị nào? Có số âm không? Điểm nổi? Sẽ có đầu vào trống?
  • Có sự trùng lặp trong đầu vào không?
  • Một số trường hợp cực đoan của đầu vào là gì?
  • Đầu vào được lưu trữ như thế nào? Nếu bạn được cung cấp một từ điển của các từ, đó là một danh sách các chuỗi hoặc một trie?

Sau khi bạn đã làm rõ đủ phạm vi và ý định của vấn đề, hãy giải thích cách tiếp cận cấp cao của bạn với người phỏng vấn, ngay cả khi đó là một giải pháp ngây thơ. Nếu bạn bị mắc kẹt, hãy xem xét các cách tiếp cận khác nhau và giải thích to tại sao nó có thể hoặc không hoạt động. Đôi khi người phỏng vấn của bạn có thể bỏ gợi ý và dẫn bạn đến con đường đúng.

Bắt đầu với một cách tiếp cận vũ phu. Truyền đạt nó cho người phỏng vấn. Giải thích sự phức tạp về thời gian và không gian và làm rõ lý do tại sao nó xấu. Không có khả năng cách tiếp cận vũ phu sẽ là phương pháp mà bạn sẽ mã hóa. Tại thời điểm này, người phỏng vấn thường sẽ xuất hiện đáng sợ, chúng ta có thể làm tốt hơn không? câu hỏi. Điều này có nghĩa là họ đang tìm kiếm một cách tiếp cận tối ưu hơn.

Đây thường là phần khó nhất của cuộc phỏng vấn. Nói chung, hãy tìm kiếm công việc lặp đi lặp lại và cố gắng tối ưu hóa chúng bằng cách lưu trữ kết quả tính toán ở đâu đó. Tham khảo nó sau, thay vì tính toán lại tất cả. Tôi cung cấp một số lời khuyên về giải quyết các câu hỏi cụ thể cụ thể của chủ đề dưới đây.

Chỉ bắt đầu mã hóa sau khi bạn và người phỏng vấn của bạn đã đồng ý về cách tiếp cận và bạn đã được bật đèn xanh.

Bắt đầu mã

Sử dụng một phong cách tốt để viết mã của bạn. Đọc mã được viết bởi người khác thường không phải là một nhiệm vụ thú vị. Đọc mã định dạng khủng khiếp được viết bởi người khác thậm chí còn tồi tệ hơn. Mục tiêu của bạn là làm cho người phỏng vấn của bạn hiểu mã của bạn để họ có thể nhanh chóng đánh giá xem mã của bạn có thực hiện được những gì nó được sử dụng và nếu nó giải quyết một vấn đề nhất định.

Sử dụng tên biến rõ ràng và tránh các tên là chữ cái đơn, trừ khi chúng được lặp lại. Tuy nhiên, nếu bạn đang mã hóa trên bảng trắng, tránh sử dụng tên biến dài dòng. Điều này làm giảm số lượng văn bản bạn sẽ phải làm.

Luôn giải thích cho người phỏng vấn những gì bạn đang viết hoặc gõ. Đây không phải là về đọc, nguyên văn, cho người phỏng vấn mã bạn đang sản xuất. Nói về phần của mã bạn hiện đang thực hiện ở cấp độ cao hơn. Giải thích tại sao nó được viết như vậy, và những gì nó đang cố gắng đạt được.

Khi bạn sao chép và dán vào mã, hãy xem xét liệu nó có cần thiết không. Đôi khi nó là, đôi khi nó không phải là. Nếu bạn thấy mình sao chép và dán một đoạn mã lớn kéo dài nhiều dòng, có lẽ bạn có thể tái cấu trúc mã bằng cách trích xuất các dòng đó thành một hàm. Nếu nó chỉ là một dòng bạn đã sao chép, thường thì nó vẫn ổn.

Tuy nhiên, hãy nhớ thay đổi các biến tương ứng trong dòng mã được sao chép của bạn khi có liên quan. Sao chép và dán lỗi là một nguồn lỗi phổ biến, ngay cả trong mã hóa hàng ngày!

Sau khi mã hóa

Sau khi bạn đã hoàn thành mã hóa, đừng thông báo ngay cho người phỏng vấn rằng bạn đã hoàn thành. Trong hầu hết các trường hợp, mã của bạn thường không hoàn hảo. Nó có thể chứa lỗi hoặc lỗi cú pháp. Những gì bạn cần làm là xem lại mã của bạn.

Đầu tiên, hãy xem qua mã của bạn từ đầu đến cuối. Nhìn vào nó như thể nó được viết bởi người khác, và bạn đang nhìn thấy nó lần đầu tiên và cố gắng phát hiện ra lỗi trong đó. Đó chính xác là những gì người phỏng vấn của bạn sẽ làm. Xem xét và khắc phục bất kỳ vấn đề bạn có thể tìm thấy.

Tiếp theo, đưa ra các trường hợp kiểm tra nhỏ và bước qua mã (không phải thuật toán của bạn) với đầu vào mẫu đó.

Người phỏng vấn thích nó khi bạn đọc suy nghĩ của họ. Những gì họ thường làm sau khi bạn đã hoàn thành mã hóa là giúp bạn viết bài kiểm tra. Đó là một điểm cộng rất lớn nếu bạn viết bài kiểm tra cho mã của mình ngay cả trước khi họ nhắc bạn làm như vậy. Bạn nên mô phỏng một trình gỡ lỗi khi bước qua mã của bạn. Ghi lại hoặc cho họ biết các giá trị của một số biến nhất định khi bạn đi bộ người phỏng vấn thông qua các dòng mã.

Nếu có những đoạn mã trùng lặp lớn trong giải pháp của bạn, hãy tái cấu trúc mã để hiển thị cho người phỏng vấn rằng bạn đánh giá cao mã hóa chất lượng. Ngoài ra, hãy chú ý đến những nơi bạn có thể đánh giá ngắn mạch.

Cuối cùng, cung cấp cho sự phức tạp về thời gian và không gian của mã của bạn và giải thích lý do tại sao nó như vậy. Bạn có thể chú thích các phần mã của mình với sự phức tạp về thời gian và không gian khác nhau để thể hiện sự hiểu biết của bạn về mã. Bạn thậm chí có thể cung cấp API của ngôn ngữ lập trình đã chọn. Giải thích bất kỳ sự đánh đổi nào trong phương pháp hiện tại của bạn so với các phương pháp thay thế, có thể về thời gian và không gian.

Nếu người phỏng vấn của bạn hài lòng với giải pháp, cuộc phỏng vấn thường kết thúc ở đây. Người phỏng vấn cũng hỏi bạn các câu hỏi mở rộng, chẳng hạn như cách bạn xử lý vấn đề nếu toàn bộ đầu vào quá lớn để phù hợp với bộ nhớ hoặc nếu đầu vào đến dưới dạng luồng. Đây là một câu hỏi tiếp theo phổ biến tại Google, nơi họ quan tâm rất nhiều về quy mô.

Câu trả lời thường là cách tiếp cận phân chia và chinh phục-thực hiện xử lý phân tán dữ liệu và chỉ đọc một số khối đầu vào từ đĩa vào bộ nhớ, viết lại đầu ra vào đĩa và kết hợp chúng sau.

Thực hành với các cuộc phỏng vấn giả

Các bước được đề cập ở trên có thể được diễn tập nhiều lần cho đến khi bạn hoàn toàn nội tâm hóa chúng và chúng trở thành bản chất thứ hai cho bạn. Một cách tốt để thực hành là hợp tác với một người bạn và thay phiên nhau phỏng vấn lẫn nhau.

Một nguồn tài nguyên tuyệt vời để chuẩn bị cho các cuộc phỏng vấn mã hóa là phỏng vấn. Nền tảng này cung cấp các cuộc phỏng vấn thực hành miễn phí và ẩn danh với các kỹ sư Google và Facebook, điều này có thể dẫn đến việc làm và thực tập thực sự.

Nhờ là ẩn danh trong cuộc phỏng vấn, quá trình phỏng vấn bao gồm là không thiên vị và rủi ro thấp. Vào cuối cuộc phỏng vấn, cả người phỏng vấn và người được phỏng vấn có thể cung cấp phản hồi cho nhau với mục đích giúp nhau cải thiện.

Làm tốt trong các cuộc phỏng vấn giả sẽ mở khóa trang việc làm cho các ứng viên và cho phép họ đặt cuộc phỏng vấn (cũng ẩn danh) với các công ty hàng đầu như Uber, Lyft, Quora, Asana, v.v. Đối với những người mới tham gia các cuộc phỏng vấn mã hóa, một cuộc phỏng vấn demo có thể được xem trên trang web này. Lưu ý rằng trang web này yêu cầu người dùng đăng nhập.

Tôi đã sử dụng Phỏng vấn.io, cả như một người phỏng vấn và người được phỏng vấn. Kinh nghiệm là tuyệt vời. Aline Lerner, Giám đốc điều hành và đồng sáng lập của Phỏng vấn.io, và nhóm của cô rất đam mê cách mạng hóa quá trình phỏng vấn mã hóa và giúp các ứng viên cải thiện kỹ năng phỏng vấn của họ.

Cô cũng đã xuất bản một số bài viết liên quan đến phỏng vấn mã hóa trên blog phỏng vấn.io. Tôi khuyên bạn nên đăng ký càng sớm càng tốt với phỏng vấn.

Một nền tảng khác cho phép bạn thực hành các cuộc phỏng vấn mã hóa là Pramp. Khi phỏng vấn.io phù hợp với những người tìm việc tiềm năng với những người phỏng vấn mã hóa dày dạn, Pramp có một cách tiếp cận khác. Pramp kết hợp bạn với một người ngang hàng khác cũng là người tìm việc. Hai bạn thay phiên nhau đảm nhận vai trò của người phỏng vấn và người được phỏng vấn. Pramp cũng chuẩn bị các câu hỏi, và cung cấp các giải pháp và lời nhắc để hướng dẫn người được phỏng vấn.

Đi ra ngoài và chinh phục

Sau khi thực hiện một số lượng lớn các câu hỏi về LeetCode và thực hành đủ thực hiện các cuộc phỏng vấn giả, hãy đi ra ngoài và đưa các kỹ năng phỏng vấn mới tìm thấy của bạn để thử nghiệm.

Áp dụng cho các công ty yêu thích của bạn hoặc, tốt hơn là vẫn nhận được sự giới thiệu từ bạn bè của bạn làm việc cho các công ty đó. Giới thiệu có xu hướng được chú ý sớm hơn và có tỷ lệ phản hồi nhanh hơn so với việc áp dụng mà không cần giới thiệu. Chúc may mắn!

Mẹo thực tế cho các câu hỏi mã hóa

Phần này đi sâu vào các mẹo thực tế cho các chủ đề cụ thể của các thuật toán và cấu trúc dữ liệu, xuất hiện thường xuyên trong các câu hỏi mã hóa. Nhiều câu hỏi thuật toán liên quan đến các kỹ thuật có thể được áp dụng cho các câu hỏi có tính chất tương tự.

Bạn càng có nhiều kỹ thuật trong kho vũ khí của mình, cơ hội của bạn để vượt qua cuộc phỏng vấn càng lớn. Đối với mỗi chủ đề, cũng có một danh sách các câu hỏi được đề xuất, có giá trị để thành thạo các khái niệm cốt lõi. Một số câu hỏi chỉ có sẵn với một thuê bao trả tiền cho LeetCode, theo tôi là hoàn toàn đáng giá nếu nó giúp bạn có một công việc.

Mẹo chung

Luôn xác nhận đầu vào trước. Kiểm tra các đầu vào không hợp lệ, trống rỗng, âm hoặc khác nhau. Không bao giờ cho rằng bạn được cung cấp các tham số hợp lệ. Ngoài ra, làm rõ với người phỏng vấn xem bạn có thể giả định đầu vào hợp lệ (thường là có), có thể tiết kiệm thời gian của bạn từ việc viết mã thực hiện xác thực đầu vào.

Có bất kỳ yêu cầu hoặc ràng buộc phức tạp về thời gian và không gian?

Kiểm tra các lỗi ngoài một.

Trong các ngôn ngữ không có sự ép buộc loại tự động, hãy kiểm tra xem việc kết hợp các giá trị có cùng loại không: ________ 11, ________ 12 và

def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
3.

Sau khi bạn hoàn thành mã của mình, hãy sử dụng một vài đầu vào ví dụ để kiểm tra giải pháp của bạn.

Là thuật toán được cho là chạy nhiều lần, có lẽ trên máy chủ web? Nếu có, đầu vào có thể có thể được xử lý trước để cải thiện hiệu quả trong mỗi cuộc gọi API.

Sử dụng hỗn hợp các mô hình lập trình chức năng và bắt buộc:

  • Viết các chức năng thuần túy thường xuyên nhất có thể.
  • Sử dụng các chức năng thuần túy vì chúng dễ lý luận hơn và có thể giúp giảm lỗi trong việc thực hiện của bạn.
  • Tránh biến đổi các tham số được truyền vào chức năng của bạn, đặc biệt nếu chúng được truyền qua tham chiếu, trừ khi bạn chắc chắn về những gì bạn đang làm.
  • Đạt được sự cân bằng giữa độ chính xác và hiệu quả. Sử dụng đúng lượng mã chức năng và bắt buộc khi thích hợp. Lập trình chức năng thường tốn kém về độ phức tạp của không gian vì không phải là sự phân bổ và phân bổ lặp đi lặp lại của các đối tượng mới. Mặt khác, mã bắt buộc nhanh hơn vì bạn hoạt động trên các đối tượng hiện có.
  • Tránh dựa vào các biến toàn cầu đột biến. Biến toàn cầu giới thiệu trạng thái.
  • Hãy chắc chắn rằng bạn không vô tình làm thay đổi các biến toàn cầu, đặc biệt nếu bạn phải dựa vào chúng.

Nói chung, để cải thiện tốc độ của một chương trình, chúng ta có thể chọn sử dụng cấu trúc dữ liệu hoặc thuật toán phù hợp hoặc để sử dụng nhiều bộ nhớ hơn. Nó có một không gian cổ điển và giao dịch thời gian.

Cấu trúc dữ liệu là vũ khí của bạn. Chọn vũ khí phù hợp cho trận chiến đúng là chìa khóa để chiến thắng. Biết các điểm mạnh của từng cấu trúc dữ liệu và độ phức tạp về thời gian cho các hoạt động khác nhau của nó.

Cấu trúc dữ liệu có thể được tăng cường để đạt được độ phức tạp thời gian hiệu quả giữa các hoạt động khác nhau. Ví dụ, HashMap có thể được sử dụng cùng với danh sách liên kết gấp đôi để đạt được độ phức tạp thời gian O (1) cho cả hoạt động

def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
4 và
def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
5 trong bộ đệm LRU.

Hashmap có lẽ là cấu trúc dữ liệu được sử dụng phổ biến nhất cho các câu hỏi thuật toán. Nếu bạn bị mắc kẹt trong một câu hỏi, phương sách cuối cùng của bạn có thể là liệt kê thông qua các cấu trúc dữ liệu có thể (rất may có rất nhiều điều đó) và xem xét liệu mỗi người trong số chúng có thể được áp dụng cho vấn đề hay không. Điều này đã làm việc cho tôi đôi khi.

Nếu bạn đang cắt các góc trong mã của mình, hãy nói lên điều đó cho người phỏng vấn của bạn và giải thích cho họ những gì bạn sẽ làm ngoài cài đặt phỏng vấn (không có hạn chế về thời gian). Ví dụ: giải thích rằng bạn sẽ viết một regex để phân tích một chuỗi thay vì sử dụng

def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
6, không bao gồm tất cả các trường hợp.

Sự phối hợp

Ghi chú

Mảng và chuỗi được coi là chuỗi (một chuỗi là một chuỗi các ký tự). Có những lời khuyên để xử lý cả mảng và chuỗi, sẽ được đề cập ở đây.

Có giá trị trùng lặp trong chuỗi không? Chúng sẽ ảnh hưởng đến câu trả lời?

Kiểm tra trình tự ra khỏi giới hạn.

Hãy chú ý về việc cắt hoặc nối các chuỗi trong mã của bạn. Thông thường, các chuỗi cắt và nối đòi hỏi thời gian O (N). Sử dụng các chỉ số bắt đầu và kết thúc để phân định một subarray hoặc con nếu có thể.

Đôi khi bạn đi qua trình tự từ phía bên phải chứ không phải từ bên trái.

Làm chủ kỹ thuật cửa sổ trượt áp dụng cho nhiều vấn đề về chuỗi con hoặc subarray.

Khi bạn được cung cấp hai chuỗi để xử lý, người ta thường có một chỉ số trên mỗi chuỗi để đi qua. Ví dụ, chúng tôi sử dụng cùng một cách tiếp cận để hợp nhất hai mảng được sắp xếp.

Trường hợp góc

  • Trình tự trống
  • Trình tự với 1 hoặc 2 phần tử
  • Trình tự với các yếu tố lặp đi lặp lại

Mảng

Ghi chú

Các mảng được sắp xếp hoặc sắp xếp một phần? Nếu đó là một trong hai, một số hình thức tìm kiếm nhị phân là có thể. Điều này thường có nghĩa là người phỏng vấn đang tìm kiếm một giải pháp nhanh hơn O (n).

Bạn có thể sắp xếp mảng không? Đôi khi sắp xếp mảng đầu tiên có thể đơn giản hóa đáng kể vấn đề. Hãy chắc chắn rằng thứ tự của các phần tử mảng không cần phải được bảo tồn trước khi cố gắng sắp xếp nó.

Đối với các câu hỏi trong đó việc tổng kết hoặc nhân của Subarray có liên quan, tính toán trước bằng cách sử dụng băm hoặc tiền tố, tổng hậu tố hoặc sản phẩm có thể hữu ích.

Nếu bạn được cung cấp một chuỗi và người phỏng vấn yêu cầu không gian O (1), có thể sử dụng chính mảng làm bảng băm. Ví dụ: nếu mảng chỉ có các giá trị từ 1 đến n, trong đó n là độ dài của mảng, hãy phủ nhận giá trị ở chỉ số đó (trừ một) để chỉ ra sự hiện diện của số đó.

Thực hành câu hỏi

  • Hai tổng
  • Thời gian tốt nhất để mua và bán cổ phiếu
  • Chứa trùng lặp
  • Sản phẩm của mảng ngoại trừ bản thân
  • Subarray tối đa
  • Subarray sản phẩm tối đa
  • Tìm mức tối thiểu trong mảng được sắp xếp xoay
  • Tìm kiếm trong mảng được sắp xếp xoay
  • 3Sum
  • Hộp đựng với hầu hết nước

Nhị phân

Liên kết nghiên cứu

  • Bit, byte, xây dựng với nhị phân

Ghi chú

Các mảng được sắp xếp hoặc sắp xếp một phần? Nếu đó là một trong hai, một số hình thức tìm kiếm nhị phân là có thể. Điều này thường có nghĩa là người phỏng vấn đang tìm kiếm một giải pháp nhanh hơn O (n).

Bạn có thể sắp xếp mảng không? Đôi khi sắp xếp mảng đầu tiên có thể đơn giản hóa đáng kể vấn đề. Hãy chắc chắn rằng thứ tự của các phần tử mảng không cần phải được bảo tồn trước khi cố gắng sắp xếp nó.

  • Đối với các câu hỏi trong đó việc tổng kết hoặc nhân của Subarray có liên quan, tính toán trước bằng cách sử dụng băm hoặc tiền tố, tổng hậu tố hoặc sản phẩm có thể hữu ích.
  • Nếu bạn được cung cấp một chuỗi và người phỏng vấn yêu cầu không gian O (1), có thể sử dụng chính mảng làm bảng băm. Ví dụ: nếu mảng chỉ có các giá trị từ 1 đến n, trong đó n là độ dài của mảng, hãy phủ nhận giá trị ở chỉ số đó (trừ một) để chỉ ra sự hiện diện của số đó.
  • Thực hành câu hỏi
  • Hai tổng
  • Thời gian tốt nhất để mua và bán cổ phiếu

Trường hợp góc

  • Trình tự trống
  • Trình tự với 1 hoặc 2 phần tử

Thực hành câu hỏi

  • Hai tổng
  • Thời gian tốt nhất để mua và bán cổ phiếu
  • Chứa trùng lặp
  • Sản phẩm của mảng ngoại trừ bản thân
  • Subarray tối đa

Subarray sản phẩm tối đa

Liên kết nghiên cứu

  • Bit, byte, xây dựng với nhị phân

Ghi chú

Các mảng được sắp xếp hoặc sắp xếp một phần? Nếu đó là một trong hai, một số hình thức tìm kiếm nhị phân là có thể. Điều này thường có nghĩa là người phỏng vấn đang tìm kiếm một giải pháp nhanh hơn O (n).

Bạn có thể sắp xếp mảng không? Đôi khi sắp xếp mảng đầu tiên có thể đơn giản hóa đáng kể vấn đề. Hãy chắc chắn rằng thứ tự của các phần tử mảng không cần phải được bảo tồn trước khi cố gắng sắp xếp nó.

Đối với các câu hỏi trong đó việc tổng kết hoặc nhân của Subarray có liên quan, tính toán trước bằng cách sử dụng băm hoặc tiền tố, tổng hậu tố hoặc sản phẩm có thể hữu ích.

Thực hành câu hỏi

  • Hai tổng
  • Thời gian tốt nhất để mua và bán cổ phiếu
  • Chứa trùng lặp
  • Sản phẩm của mảng ngoại trừ bản thân
  • Subarray tối đa
  • Subarray sản phẩm tối đa
  • Tìm mức tối thiểu trong mảng được sắp xếp xoay
  • Tìm kiếm trong mảng được sắp xếp xoay
  • Hộp đựng với hầu hết nước
  • Nhị phân
  • Liên kết nghiên cứu

Bit, byte, xây dựng với nhị phân

Ghi chú

Các mảng được sắp xếp hoặc sắp xếp một phần? Nếu đó là một trong hai, một số hình thức tìm kiếm nhị phân là có thể. Điều này thường có nghĩa là người phỏng vấn đang tìm kiếm một giải pháp nhanh hơn O (n).

Bạn có thể sắp xếp mảng không? Đôi khi sắp xếp mảng đầu tiên có thể đơn giản hóa đáng kể vấn đề. Hãy chắc chắn rằng thứ tự của các phần tử mảng không cần phải được bảo tồn trước khi cố gắng sắp xếp nó.

Đối với các câu hỏi trong đó việc tổng kết hoặc nhân của Subarray có liên quan, tính toán trước bằng cách sử dụng băm hoặc tiền tố, tổng hậu tố hoặc sản phẩm có thể hữu ích.

Liên kết nghiên cứu

  • Bit, byte, xây dựng với nhị phân
  • Các câu hỏi liên quan đến biểu diễn nhị phân và hoạt động bitwise đôi khi được hỏi. Bạn phải biết cách chuyển đổi một số từ dạng thập phân sang dạng nhị phân và ngược lại, trong ngôn ngữ lập trình đã chọn của bạn.
  • Một số đoạn trích tiện ích hữu ích:

Ghi chú

Các mảng được sắp xếp hoặc sắp xếp một phần? Nếu đó là một trong hai, một số hình thức tìm kiếm nhị phân là có thể. Điều này thường có nghĩa là người phỏng vấn đang tìm kiếm một giải pháp nhanh hơn O (n).

Bạn có thể sắp xếp mảng không? Đôi khi sắp xếp mảng đầu tiên có thể đơn giản hóa đáng kể vấn đề. Hãy chắc chắn rằng thứ tự của các phần tử mảng không cần phải được bảo tồn trước khi cố gắng sắp xếp nó.

  • Đối với các câu hỏi trong đó việc tổng kết hoặc nhân của Subarray có liên quan, tính toán trước bằng cách sử dụng băm hoặc tiền tố, tổng hậu tố hoặc sản phẩm có thể hữu ích.
  • Nếu bạn được cung cấp một chuỗi và người phỏng vấn yêu cầu không gian O (1), có thể sử dụng chính mảng làm bảng băm. Ví dụ: nếu mảng chỉ có các giá trị từ 1 đến n, trong đó n là độ dài của mảng, hãy phủ nhận giá trị ở chỉ số đó (trừ một) để chỉ ra sự hiện diện của số đó.
  • Thực hành câu hỏi

Hai tổng

Thời gian tốt nhất để mua và bán cổ phiếu

  • Chứa trùng lặp
  • Sản phẩm của mảng ngoại trừ bản thân
  • Subarray tối đa

Subarray sản phẩm tối đa

Khi đi ngang qua ma trận, luôn đảm bảo rằng vị trí tiếp theo của bạn nằm trong ranh giới của ma trận. Nhiều mẹo để thực hiện DFS trên ma trận có thể được tìm thấy ở đây. Một mẫu đơn giản để thực hiện DFS trên ma trận xuất hiện một cái gì đó như thế này:

def traverse(matrix):
  rows, cols = len(matrix), len(matrix[0])
  visited = set()
  directions = ((0, 1), (0, -1), (1, 0), (-1, 0))
  def dfs(i, j):
    if (i, j) in visited:
      return
    visited.add((i, j))
    # Traverse neighbors
    for direction in directions:
      next_i, next_j = i + direction[0], j + direction[1]
      if 0 <= next_i < rows and 0 <= next_j < cols: # Check boundary
        # Add any other checking here ^
        dfs(next_i, next_j)
  for i in range(rows):
    for j in range(cols):
      dfs(i, j)

Trường hợp góc

  • Đồ thị trống
  • Đồ thị với một hoặc hai nút
  • Biểu đồ phân tách
  • Đồ thị với chu kỳ

Thực hành câu hỏi

  • Hai tổng
  • Thời gian tốt nhất để mua và bán cổ phiếu
  • Chứa trùng lặp
  • Sản phẩm của mảng ngoại trừ bản thân
  • Subarray tối đa
  • Subarray sản phẩm tối đa
  • Khi đi ngang qua ma trận, luôn đảm bảo rằng vị trí tiếp theo của bạn nằm trong ranh giới của ma trận. Nhiều mẹo để thực hiện DFS trên ma trận có thể được tìm thấy ở đây. Một mẫu đơn giản để thực hiện DFS trên ma trận xuất hiện một cái gì đó như thế này:
  • Trường hợp góc

Đồ thị trống

Ghi chú

Các mảng được sắp xếp hoặc sắp xếp một phần? Nếu đó là một trong hai, một số hình thức tìm kiếm nhị phân là có thể. Điều này thường có nghĩa là người phỏng vấn đang tìm kiếm một giải pháp nhanh hơn O (n).

Bạn có thể sắp xếp mảng không? Đôi khi sắp xếp mảng đầu tiên có thể đơn giản hóa đáng kể vấn đề. Hãy chắc chắn rằng thứ tự của các phần tử mảng không cần phải được bảo tồn trước khi cố gắng sắp xếp nó.

rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
2.

Đối với các câu hỏi trong đó việc tổng kết hoặc nhân của Subarray có liên quan, tính toán trước bằng cách sử dụng băm hoặc tiền tố, tổng hậu tố hoặc sản phẩm có thể hữu ích.

Nếu bạn được cung cấp một chuỗi và người phỏng vấn yêu cầu không gian O (1), có thể sử dụng chính mảng làm bảng băm. Ví dụ: nếu mảng chỉ có các giá trị từ 1 đến n, trong đó n là độ dài của mảng, hãy phủ nhận giá trị ở chỉ số đó (trừ một) để chỉ ra sự hiện diện của số đó.

Thực hành câu hỏi

Hai tổng

Thời gian tốt nhất để mua và bán cổ phiếu

def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]

Trường hợp góc

  • Đồ thị trống
  • Đồ thị với một hoặc hai nút
  • Biểu đồ phân tách
  • Đồ thị với chu kỳ

Thực hành câu hỏi

  • Hai tổng
  • Thời gian tốt nhất để mua và bán cổ phiếu
  • Chứa trùng lặp
  • Sản phẩm của mảng ngoại trừ bản thân

Subarray tối đa

Ghi chú

Các mảng được sắp xếp hoặc sắp xếp một phần? Nếu đó là một trong hai, một số hình thức tìm kiếm nhị phân là có thể. Điều này thường có nghĩa là người phỏng vấn đang tìm kiếm một giải pháp nhanh hơn O (n).

Bạn có thể sắp xếp mảng không? Đôi khi sắp xếp mảng đầu tiên có thể đơn giản hóa đáng kể vấn đề. Hãy chắc chắn rằng thứ tự của các phần tử mảng không cần phải được bảo tồn trước khi cố gắng sắp xếp nó.

rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
2.

Đối với các câu hỏi trong đó việc tổng kết hoặc nhân của Subarray có liên quan, tính toán trước bằng cách sử dụng băm hoặc tiền tố, tổng hậu tố hoặc sản phẩm có thể hữu ích.

Nếu bạn được cung cấp một chuỗi và người phỏng vấn yêu cầu không gian O (1), có thể sử dụng chính mảng làm bảng băm. Ví dụ: nếu mảng chỉ có các giá trị từ 1 đến n, trong đó n là độ dài của mảng, hãy phủ nhận giá trị ở chỉ số đó (trừ một) để chỉ ra sự hiện diện của số đó.

Thực hành câu hỏi

Hai tổng

Thời gian tốt nhất để mua và bán cổ phiếu

Đồ thị trống

  • Đồ thị với một hoặc hai nútfrom the last node: Have two pointers, where one is k nodes ahead of the other. When the node ahead reaches the end, the other node is k nodes behind.
  • Biểu đồ phân tách
  • Đồ thị với chu kỳ

Đồ thị bản sao

  • Lịch trình khóa học
  • Từ điển ngoài hành tinh
  • Đồ thị với một hoặc hai nút
  • Biểu đồ phân tách

Trường hợp góc

  • Đồ thị trống
  • Thêm một nút giả ở đầu và /hoặc đuôi có thể giúp xử lý nhiều trường hợp cạnh trong đó các hoạt động phải được thực hiện ở đầu hoặc đuôi. Sự hiện diện của các nút giả đảm bảo rằng các hoạt động sẽ không bao giờ được thực hiện trên đầu hoặc đuôi. Các nút giả loại bỏ cơn đau đầu của việc viết kiểm tra có điều kiện để đối phó với các con trỏ null. Hãy chắc chắn để loại bỏ chúng ở cuối hoạt động.
  • Đôi khi vấn đề danh sách được liên kết có thể được giải quyết mà không cần lưu trữ bổ sung. Cố gắng mượn ý tưởng từ vấn đề danh sách liên kết ngược.

Thực hành câu hỏi

  • Đồ thị bản sao
  • Lịch trình khóa học
  • Từ điển ngoài hành tinh
  • Dòng nước Đại Tây Dương Thái Bình Dương
  • Số đảo
  • Đồ thị cây hợp lệ

Số lượng các thành phần được kết nối trong một biểu đồ không mong muốn

Ghi chú

Câu hỏi khoảng là câu hỏi đưa ra một mảng mảng hai phần tử (một khoảng). Hai giá trị đại diện cho một giá trị bắt đầu và một giá trị cuối. Các câu hỏi khoảng được coi là một phần của họ mảng, nhưng chúng liên quan đến một số kỹ thuật phổ biến. Do đó, họ có phần đặc biệt của riêng họ.

Một ví dụ về một mảng khoảng:

rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
2.

Các câu hỏi khoảng thời gian có thể là khó khăn cho những người không có kinh nghiệm với họ. Điều này là do số lượng trường hợp tuyệt đối để xem xét khi các mảng khoảng thời gian trùng nhau.

Làm rõ với người phỏng vấn xem

rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
3 và
rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
4 có được coi là khoảng thời gian chồng chéo hay không, bởi vì nó ảnh hưởng đến cách bạn sẽ viết séc bình đẳng của mình.

Nếu câu hỏi yêu cầu thực hiện một nhà điều hành như Power, Squareroot hoặc Division, và nó nhanh hơn O (N), tìm kiếm nhị phân thường là cách tiếp cận.

Một số công thức phổ biến

  • Tổng 1 đến n = (n+1) * n/2
  • Tổng của gp = 2⁰ + 2¹ + 2² + 2³ +, 2^n = 2^(n + 1) -1
  • Hoán vị của n = n! / (N-k)!
  • Sự kết hợp của N = N! / (K! * (N-K)!)

Trường hợp góc

  • Phân chia theo 0
  • Tràn số nguyên và dòng chảy

Thực hành câu hỏi

  • Pow (x, n)
  • Sqrt(x)
  • Số nguyên đến từ tiếng Anh

Ma trận

Ghi chú

Câu hỏi khoảng là câu hỏi đưa ra một mảng mảng hai phần tử (một khoảng). Hai giá trị đại diện cho một giá trị bắt đầu và một giá trị cuối. Các câu hỏi khoảng được coi là một phần của họ mảng, nhưng chúng liên quan đến một số kỹ thuật phổ biến. Do đó, họ có phần đặc biệt của riêng họ.

Một ví dụ về một mảng khoảng:

rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
  • Các câu hỏi khoảng thời gian có thể là khó khăn cho những người không có kinh nghiệm với họ. Điều này là do số lượng trường hợp tuyệt đối để xem xét khi các mảng khoảng thời gian trùng nhau.
  • Làm rõ với người phỏng vấn xem
def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
6

Trường hợp góc

  • Phân chia theo 0
  • Tràn số nguyên và dòng chảy
  • Thực hành câu hỏi

Thực hành câu hỏi

  • Pow (x, n)
  • Số nguyên đến từ tiếng Anh
  • Ma trận
  • Ghi chú

Câu hỏi khoảng là câu hỏi đưa ra một mảng mảng hai phần tử (một khoảng). Hai giá trị đại diện cho một giá trị bắt đầu và một giá trị cuối. Các câu hỏi khoảng được coi là một phần của họ mảng, nhưng chúng liên quan đến một số kỹ thuật phổ biến. Do đó, họ có phần đặc biệt của riêng họ.

Ghi chú

Câu hỏi khoảng là câu hỏi đưa ra một mảng mảng hai phần tử (một khoảng). Hai giá trị đại diện cho một giá trị bắt đầu và một giá trị cuối. Các câu hỏi khoảng được coi là một phần của họ mảng, nhưng chúng liên quan đến một số kỹ thuật phổ biến. Do đó, họ có phần đặc biệt của riêng họ.

Một ví dụ về một mảng khoảng:

Các câu hỏi khoảng thời gian có thể là khó khăn cho những người không có kinh nghiệm với họ. Điều này là do số lượng trường hợp tuyệt đối để xem xét khi các mảng khoảng thời gian trùng nhau.

Làm rõ với người phỏng vấn xem

rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
3 và
rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
4 có được coi là khoảng thời gian chồng chéo hay không, bởi vì nó ảnh hưởng đến cách bạn sẽ viết séc bình đẳng của mình.

Thực hành câu hỏi

  • Pow (x, n)
  • Số nguyên đến từ tiếng Anh

Ma trận

Ghi chú

Câu hỏi khoảng là câu hỏi đưa ra một mảng mảng hai phần tử (một khoảng). Hai giá trị đại diện cho một giá trị bắt đầu và một giá trị cuối. Các câu hỏi khoảng được coi là một phần của họ mảng, nhưng chúng liên quan đến một số kỹ thuật phổ biến. Do đó, họ có phần đặc biệt của riêng họ.

Một ví dụ về một mảng khoảng:

Nhiều trò chơi dựa trên lưới có thể được mô hình hóa như một ma trận. Ví dụ, tic-tac-toe, sudoku, ô chữ, kết nối 4 và tàu chiến. Không có gì lạ khi được yêu cầu xác minh điều kiện chiến thắng của trò chơi. Đối với các trò chơi như tic-tac-toe, kết nối 4 và ô chữ, việc xác minh phải được thực hiện theo chiều dọc và chiều ngang. Một mẹo là viết mã để xác minh ma trận cho các ô ngang. Sau đó chuyển đổi ma trận, tái sử dụng logic được sử dụng để xác minh ngang để xác minh các ô dọc ban đầu (hiện đang nằm ngang).

Việc chuyển một ma trận trong Python chỉ đơn giản là:

Ma trận trống. Kiểm tra xem không có mảng nào là 0 chiều dài.

  • 1 x 1 ma trận.
  • Ma trận chỉ có một hàng hoặc cột.

Đặt số 0 ma trận

  • Ma trận xoắn ốc
  • Xoay hình ảnh

Tìm từ

Đệ quy

def is_overlap(a, b):
  return a[0] < b[1] and b[0] < a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]
7

Đệ quy rất hữu ích cho hoán vị, bởi vì nó tạo ra tất cả các kết hợp và câu hỏi dựa trên cây. Bạn nên biết cách tạo ra tất cả các hoán vị của một chuỗi cũng như cách xử lý các bản sao.

Hãy nhớ luôn xác định một trường hợp cơ sở để đệ quy của bạn sẽ kết thúc.

Đệ quy ngầm sử dụng một ngăn xếp. Do đó, tất cả các phương pháp đệ quy có thể được viết lại một cách lặp đi lặp lại bằng cách sử dụng một ngăn xếp.

Cảnh giác với các trường hợp trong đó mức độ đệ quy đi quá sâu và gây ra tràn chồng (giới hạn mặc định trong Python là 1000). Bạn có thể nhận được điểm thưởng khi chỉ ra điều này cho người phỏng vấn.

  • Đệ quy sẽ không bao giờ là độ phức tạp không gian O (1) vì có liên quan, trừ khi có tối ưu hóa cuộc gọi đuôi (TCO). Tìm hiểu xem ngôn ngữ được chọn của bạn có hỗ trợ TCO không.
  • Tập hợp con và tập hợp con
  • STROBOGRAMMATIC số II

Sợi dây

Một palindrom là một từ, cụm từ, số hoặc chuỗi các ký tự khác đọc cùng một lùi và về phía trước, chẳng hạn như Madam hoặc Racecar.palindrome is a word, phrase, number, or other sequence of characters that reads the same backward and forward, such as madam or racecar.palindrome is a word, phrase, number, or other sequence of characters that reads the same backward and forward, such as madam or racecar.

Dưới đây là những cách để xác định xem một chuỗi có phải là một palindrom:

  • Đảo ngược chuỗi và nó phải bằng chính nó.
  • Có hai gợi ý ở đầu và cuối chuỗi. Di chuyển các con trỏ vào trong cho đến khi họ gặp nhau. Tại bất kỳ thời điểm nào, các nhân vật ở cả hai con trỏ sẽ khớp.

Thứ tự của các ký tự trong các vấn đề chuỗi, vì vậy các hashmap thường không hữu ích.

Khi một câu hỏi là về việc đếm số lượng palindromes, một mẹo phổ biến là có hai con trỏ di chuyển ra ngoài, ra khỏi giữa. Lưu ý rằng palindromes có thể có chiều dài chẵn hoặc lẻ. Đối với mỗi vị trí xoay giữa, bạn cần kiểm tra nó hai lần: một khi điều đó bao gồm nhân vật và một lần không có ký tự.

  • Đối với chất nền, bạn có thể chấm dứt sớm sau khi không có trận đấu.
  • Đối với các phần tiếp theo, sử dụng lập trình động vì có các vấn đề phụ chồng chéo. Kiểm tra câu hỏi này.

Trường hợp góc

  • Chuỗi trống
  • Chuỗi đơn lẻ
  • Chuỗi chỉ có một ký tự riêng biệt

Thực hành câu hỏi

  • Chất nền dài nhất mà không lặp lại các ký tự
  • Thay thế nhân vật lặp lại lâu nhất
  • Chất nền cửa sổ tối thiểu
  • Mã hóa và giải mã chuỗi
  • Anagram hợp lệ
  • Đoàn A -ANTRAM
  • Dấu ngoặc đơn hợp lệ
  • Palindrom hợp lệ
  • Chất nền dài nhất palindromic
  • Subrings palindromic

Cây

Liên kết nghiên cứu

  • Lá nó lên đến cây nhị phân

Ghi chú

Một cây là một biểu đồ acyclic không mong muốn và được kết nối.

Đệ quy là một cách tiếp cận phổ biến cho cây. Khi bạn nhận thấy rằng vấn đề cây con có thể được sử dụng để giải quyết toàn bộ vấn đề, hãy thử sử dụng đệ quy.

Khi sử dụng đệ quy, luôn luôn nhớ kiểm tra trường hợp cơ sở, thường là nơi nút là

rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
8.

Khi bạn được yêu cầu đi qua một cây theo cấp độ, hãy sử dụng tìm kiếm đầu tiên về độ sâu.

Đôi khi có thể hàm đệ quy của bạn cần trả về hai giá trị.

Nếu câu hỏi liên quan đến việc tổng kết các nút trên đường đi, hãy chắc chắn kiểm tra xem các nút có thể âm hay không.

Bạn nên rất quen thuộc với việc viết đơn đặt hàng trước, theo đơn đặt hàng và sau đơn đặt hàng đệ quy. Là một phần mở rộng, thử thách bản thân bằng cách viết chúng một cách lặp đi lặp lại. Đôi khi những người phỏng vấn hỏi các ứng viên cho cách tiếp cận lặp đi lặp lại, đặc biệt nếu ứng viên hoàn thành việc viết phương pháp đệ quy quá nhanh.

Cây nhị phân

Truyền hàng theo thứ tự của một cây nhị phân là không đủ để tuần tự hóa một cây. Traversal đặt hàng trước hoặc sau đơn đặt hàng cũng được yêu cầu.

Cây tìm kiếm nhị phân (BST)

Truyền tải theo thứ tự của một BST sẽ cung cấp cho bạn tất cả các yếu tố theo thứ tự.

Hãy rất quen thuộc với các thuộc tính của một BST. Xác thực rằng một cây nhị phân là một BST. Điều này xuất hiện thường xuyên hơn dự kiến.

Khi một câu hỏi liên quan đến BST, người phỏng vấn thường tìm kiếm một giải pháp chạy nhanh hơn O (n).

Trường hợp góc

  • Chuỗi trống
  • Chuỗi đơn lẻ
  • Chuỗi chỉ có một ký tự riêng biệt
  • Thực hành câu hỏi

Thực hành câu hỏi

  • Chất nền dài nhất mà không lặp lại các ký tự
  • Thay thế nhân vật lặp lại lâu nhất
  • Chất nền cửa sổ tối thiểu
  • Mã hóa và giải mã chuỗi
  • Anagram hợp lệ
  • Đoàn A -ANTRAM
  • Dấu ngoặc đơn hợp lệ
  • Palindrom hợp lệ
  • Chất nền dài nhất palindromic
  • Subrings palindromic
  • Cây

Liên kết nghiên cứu

Liên kết nghiên cứu

  • Lá nó lên đến cây nhị phân
  • Ghi chú

Ghi chú

Một cây là một biểu đồ acyclic không mong muốn và được kết nối.

Đệ quy là một cách tiếp cận phổ biến cho cây. Khi bạn nhận thấy rằng vấn đề cây con có thể được sử dụng để giải quyết toàn bộ vấn đề, hãy thử sử dụng đệ quy.

Khi sử dụng đệ quy, luôn luôn nhớ kiểm tra trường hợp cơ sở, thường là nơi nút là

rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)
8.

Thực hành câu hỏi

  • Ghi chú
  • Một cây là một biểu đồ acyclic không mong muốn và được kết nối.
  • Đệ quy là một cách tiếp cận phổ biến cho cây. Khi bạn nhận thấy rằng vấn đề cây con có thể được sử dụng để giải quyết toàn bộ vấn đề, hãy thử sử dụng đệ quy.

Khi sử dụng đệ quy, luôn luôn nhớ kiểm tra trường hợp cơ sở, thường là nơi nút là

Liên kết nghiên cứu

  • Lá nó lên đến cây nhị phân

Ghi chú

Một cây là một biểu đồ acyclic không mong muốn và được kết nối.

Đệ quy là một cách tiếp cận phổ biến cho cây. Khi bạn nhận thấy rằng vấn đề cây con có thể được sử dụng để giải quyết toàn bộ vấn đề, hãy thử sử dụng đệ quy.

Thực hành câu hỏi

  • Chất nền dài nhất mà không lặp lại các ký tự
  • Thay thế nhân vật lặp lại lâu nhất
  • Chất nền cửa sổ tối thiểu

Mã hóa và giải mã chuỗi

Anagram hợp lệ

Đoàn A -ANTRAM

  1. Dấu ngoặc đơn hợp lệ
  2. Palindrom hợp lệ
  3. Chất nền dài nhất palindromic
  4. Subrings palindromic
  5. Cây
  6. Liên kết nghiên cứu

Lá nó lên đến cây nhị phân

Ghi chú

Một cây là một biểu đồ acyclic không mong muốn và được kết nối.

Đệ quy là một cách tiếp cận phổ biến cho cây. Khi bạn nhận thấy rằng vấn đề cây con có thể được sử dụng để giải quyết toàn bộ vấn đề, hãy thử sử dụng đệ quy.

Khi sử dụng đệ quy, luôn luôn nhớ kiểm tra trường hợp cơ sở, thường là nơi nút là



Khi sử dụng đệ quy, luôn luôn nhớ kiểm tra trường hợp cơ sở, thường là nơi nút là rows, cols = len(matrix), len(matrix[0]) copy = [[0 for _ in range(cols)] for _ in range(rows)8.

Tóm lại, để làm tốt trong các cuộc phỏng vấn mã hóa:

Quyết định ngôn ngữ lập trình.

Nghiên cứu các nguyên tắc cơ bản CS

Thực hành giải quyết các câu hỏi thuật toán

Nội tâm hóa các cuộc phỏng vấn của DO và don

Thực hành bằng cách thực hiện các cuộc phỏng vấn kỹ thuật giả

JavaScript..

Phỏng vấn thành công để có được công việc

Bằng cách làm theo các bước này, bạn sẽ cải thiện các kỹ năng phỏng vấn mã hóa của mình và tiến một bước gần hơn (hoặc có thể nhiều hơn) để hạ cánh công việc mơ ước của bạn.you can use any one of the following eight languages: C#, C++, Java, C, Python, Ruby, Swift, and JavaScript.

Tất cả tốt nhất!

Nội dung cho bài viết này có thể được tìm thấy ở đây. Cập nhật trong tương lai sẽ được đăng ở đó. Kéo yêu cầu cho các đề xuất và sửa chữa được hoan nghênh.. Learning enough python for interviewing will take 12–17 hours and will improve your chances of receiving an offer. I'm a Lead/Senior Software engineer at a small company based out of Boulder. I've interviewed for 20+ different software jobs over the years.

Nếu bạn thích bài viết này, hãy chia sẻ nó với bạn bè của bạn!

Bạn cũng có thể theo dõi tôi trên GitHub và Twitter.it will be absolutely fine as long as you understand the gotchas of the language you are using to code your interview problem and can explain them if asked.