Bài viết gốc: Leetcode by @hellovai

Mục tiêu

Nhiều người sử dụng Leetcode sai cách. Dưới đây là hướng dẫn từng bước hiệu quả nhất để học tập trên Leetcode. Điều quan trọng nhất là xác định việc bạn luyện tập để làm gì. Nhìn chung mục tiêu chính của hầu hết mọi người trên Leetcode là cho các cuộc phỏng vấn kỹ thuật.

Những điều không nên làm

  • Đọc đề bài, nghĩ rằng mình biết đáp án và bắt tay vào code.
  • Làm khoảng 30 bài một ngày trước buổi phỏng vấn.
  • Không làm bài leetcode nào cả.

Leetcode khác gì với phỏng vấn thực tế

Những điểm chung giữa leetcode và phỏng vấn thật là:

  • Các dạng đề bài
  • Đáp án đầu tiên bạn đưa ra không phải là đáp án tốt nhất
  • Phỏng vấn Online giống với làm trên Leetcode

Những điểm khác nhau là:

  • Buổi phỏng vấn bị giới hạn thời gian
  • Nhà tuyển dụng không đưa ra mẫu code bắt đầu nào (khung solution)
  • Nhà tuyển dụng không nói cho bạn phạm vi kiến thức của các đề bài
  • Nhà tuyển dụng không nói cho bạn đề bài khó như nào
  • Buổi phỏng vấn không có nút “Test” để bạn kiểm tra đáp án
  • Nhà phỏng vấn yêu cầu bạn giải thích về đáp án, cách bạn giải quyết vấn đề

Còn rất nhiều điểm khác biệt nữa, vì thế để chuẩn bị cho buổi phỏng vấn bạn cần phải luyện tập theo cách gần giống với phỏng vấn thật nhất.

Ngôn ngữ lập trình nào tốt nhất

Không quan trọng bạn dùng ngôn ngữ nào, không có vấn đề gì nếu bạn sử dụng các ngôn ngữ sau:

  • C++
  • Java
  • Python
  • Javascript

Chọn một ngôn ngữ bạn thành thạo nhất. Tuy nhiên hãy thực sự hiểu ngôn ngữ bạn sử dụng. Theo nguyên tắc chung, trước các cuộc phỏng vấn bạn cần lập trình hơn 1000 dòng các dự án lớn nhỏ bằng ngôn ngữ đó.

Tham khảo khóa học Java Cấu trúc dữ liệu và Giải thuật sử dụng LeetCode, thuộc lộ trình Java Spring Boot Full Stack 7 tháng
Tư vấn khóa học LH Ms Huong 0382416368

Ôn tập cấu trúc dữ liệu

Bạn sẽ không học được nhiều từ Leetcode nếu bạn không hiểu cấu trúc dữ liệu.

Bạn đã từng tự mình triển khai từng cấu trúc dữ liệu này mà không có thư viện chuẩn chưa?

Nếu chưa, hãy làm việc này trước! Việc này có ích hơn nhiều so với dành thời gian trên Leetcode mà chưa biết về cấu trúc dữ liệu. Thêm đó, hãy chia sẻ kiến thức của mình lên GitHub sau khi hoàn thành.

Bảng phân loại

(Không dịch để giữ tính chính xác của thuật ngữ)

CategoryData Structures
LinearArray

Vector

Linked List

Circular Buffer |
| Restricted Linear | Stack

Queue

Priority Queue |
| Heirarchial | Trie

Binary Search Tree (BST)

Balanced BST+ |
| Containers | Unordered Set

Unordered Map (Dictionary) |
| Group Name Pending | Graphs

Heap |

Với mỗi cấu trúc dữ liệu trên, hãy nắm được cách xử lý dữ liệu theo bảng sau. Một vài phương thức có thể không áp dụng được cho một số cấu trúc dữ liệu nhất định:

Bảng phương thức

(Không dịch để giữ tính chính xác của thuật ngữ)

| | Insert

  • Index

  • Front

  • Back | Remove

  • Index

  • Front

  • Back | Access

  • Index

  • Front

  • Back | Find By Value |
    | — | — | — | — | — |
    | Array | | | | |
    | Vector | | | | |
    | Linked List | | | | |
    | Circular Buffer | | | | |
    | | | | | |
    | Stack | | | | |
    | Queue | | | | |
    | Priority Queue | | | | |
    | | | | | |
    | Trie | | | | |
    | Binary Search Tree (BST) | | | | |
    | Balanced BST | | | | |
    | | | | | |
    | Unordered Set | | | | |
    | Unordered Map | | | | |
    | | | | | |
    | Graph | | | | |
    | Heap | | | | |

Cách thức chung

Thực hành mỗi ngày với 2 bài một ngày. Một vào buổi sáng, một vào buổi tối.

Đừng đặt mực tiêu trở nên pro chỉ sau một tháng. Hãy cho bản thân 6 tháng, bạn sẽ hoàn thành 360 bài tập.

Đặt hẹn giờ mỗi phiên 40 phút

Nếu bạn không giải được đề bài trong khoảng thời gian trên hãy dừng lại, xem qua đáp án và cố gắng hiểu nó. Sau đó cố gắng code lại mà không nhìn và đáp án. Nếu bạn hoành thành trước thời gian, hãy cố gắng thử xem có cải tiến thêm được không? Cách triển khai? Thời gian thực thi? Bộ nhớ sử dụng? Nếu không còn gì để cải tiến hãy viết comment trong code sao lý do tại sao?

Ít nhất 2 lần một tuần, cố gắng không nhấn nút chạy thử.

Một vài công ty không cung cấp trình biên dịch compiler, bạn chỉ có trình soạn thảo code. Nếu bạn có bảng trắng hãy viết lên đó.

Yêu cầu sự giúp đỡ

Nếu bạn đọc đáp án mà không hiểu, hãy thử hỏi bạn bè, thầy cô giải thích cho bạn. Ngược lại, việc giải thích cho người khác giúp bạn thực hành kỹ năng thuyết trình đáp án trong buổi phỏng vấn. Điều này rất có ích cho bạn.

Chia nhỏ thời gian cho mỗi bài tập

Lưu ý: các phần sau đây được triển khai trong điều kiện của buổi phỏng vấn.

TimeSectionGoal
0:002 minHiểu đề bài
0:021 minViết ra fuction signature [1]
0:035 minXác nhận sự hiểu biết đề bài bằng cách đưa ra một vài trường hợp thử nghiệm và xem kết quả. Bãn có thể sẽ thấy khuôn mẫu củ vấn đề
0:085 minThử nói ra giải pháp, hoặc viết mã psuedocode, Nếu không có giải pháp nào hãy dùng thời gian này nói lên suy nghĩ của bạn về các trường hợp thử nghiệm ở trên.
0:135 - 17 minsĐối với những câu hỏi dễ, bạn có thể triển khai solution ngay. Thông thường trong buổi phỏng vấn thực thế, đối với câu dễ, người phỏng vấn sẽ hỏi tiếp câu khó và bạn sẽ quay về mốc 0:00 ở trên.
0:305 minsKiểm tra solution với các trường hợp đưa ra ở trên, và hoàn thiện các lỗi khác.
0:354 minsLên tiếng xác nhận đáp án của bạn. Bạn có thể cải tiến nó thêm không? Bạn thấy tối ưu chưa? Có trường hợp input nào sai không?
0:391 minhúc mừng bạn hoàn thành công việc và nghỉ ngơi chút xíu.
0:4020 minsTham khảo đáp án trên leetcode. Bạn có hiểu nó không? Thời gian chạy - O(runtime) có khác không? Xem xét O(memory). Họ sử dụng cấu trú dữ liệu nào? Bạn có bỏ sót trường hợp hi hữu nào không? Có thông tin quan trọng nào bạn bỏ qua không?

Lưu ý rằng ở phút 40 của mỗi phiên bạn nên dừng lại việc tìm đáp án. Nó giúp Leetcode không như một việc làm vô tận. Sau một giờ bạn nên hoàn thành buổi học đó.

[1] Function signature: bao gồm tên hàm, tham số truyền vào và kiểu trả về.