Thư Viện Câu Hỏi Phỏng Vấn

Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.

Tất cả công nghệ .Net (39) ADO.NET (33) Agile scrum (43) Android (44) Angular (121) API Design (53) Arrays (19) ASP.NET (52) ASP.NET MVC (35) ASP.NET Web API (32) Availability & Reliability (2) Azure (53) Backtracking (7) Big-O Notation (16) Binary Tree (19) Bit Manipulation (9) Blockchain (42) C# (105) Caching (2) CAP Theorem (2) CDN (2) Concurrency (2) Cosmos DB (50) Cryptography (4) CSS (63) Data Structures (69) Databases (50) DDD (2) Dependency Injection (4) Design pattern (23) Devops (32) Divide & Conquer (2) Docker (38) Dynamic Programming (10) Entity Framework (57) Fibonacci Series (4) Flutter (136) Git (63) Go lang (60) Graph Theory (19) GraphQL (71) Greedy Algorithms (7) Hash Tables (25) Heaps and Maps (10) HTML (73) Ionic (29) IOS (75) Java (141) Javascript (137) jQuery (95) Kotlin (60) Kubernetes (27) Laravel (90) Layering & Middleware (2) Linked Lists (17) LINQ (30) Load Balancing (2) Microservices (30) Mongodb (27) MySQL (58) Net core (66) Node.js (119) NoSQL (2) Objective-C (33) OOP (75) Package Managerment (60) PHP (78) PostgreSQL (50) PWA (22) Python (82) Queues (11) React Native (38) React.js (116) Reactive Programming (11) Recursion (5) Redis (25) Ruby (79) Ruby on Rails (121) Rust (88) Searching (18) SOA (2) Software Architecture (3) Software Testing (11) Sorting (13) Spring (78) SQL (43) SQL Server (66) Stacks (10) Strings (17) Swift (89) Systems Design (50) T-SQL (43) Trees (31) Trie (8) Typescript (100) Unit testing (22) UX Design (74) Vue.js (84) Web security (45) WebSockets (25) Xamarin (81)
01

Hãy phân biệt sự khác nhau giữa tiếp cận Bottom-Up (Tabulation) và Top-Down (Memoization) trong Quy hoạch động?

Senior
  • Top-Down (Memoization): Bắt đầu giải quyết từ bài toán lớn nhất bằng đệ quy. Trong quá trình chạy, kết quả của các bài toán con sẽ được lưu lại (thường trong HashMap hoặc mảng). Khi gặp lại bài toán con đó, ta trả về ngay kết quả đã lưu mà không cần tính lại. Dễ hiểu và tự nhiên nhưng tốn chi phí gọi hàm đệ quy trên Stack.
  • Bottom-Up (Tabulation): Bắt đầu giải quyết từ các bài toán con nhỏ nhất trước, điền kết quả vào một bảng (mảng 1D hoặc 2D) bằng vòng lặp, sau đó sử dụng các kết quả này để tính toán dần lên bài toán lớn hơn. Tránh được việc tràn Stack và thường tối ưu hơn về không gian bộ nhớ.
  • 02

    Bài toán cái túi (0/1 Knapsack Problem) được giải quyết bằng Quy hoạch động như thế nào?

    Senior

    Bài toán yêu cầu chọn các đồ vật có khối lượng và giá trị sao cho tổng khối lượng không vượt quá W và tổng giá trị lớn nhất:

    1. Trạng thái: Gọi dp[i][w] là giá trị lớn nhất có thể đạt được khi chọn trong i đồ vật đầu tiên với giới hạn khối lượng là w.
    2. Công thức truy hồi: Với đồ vật thứ i có khối lượng weight[i] và giá trị val[i]:
      • Nếu weight[i] > w: Không thể chọn đồ vật này -> dp[i][w] = dp[i-1][w].
      • Nếu weight[i] <= w: Ta chọn giá trị lớn hơn giữa việc lấy hoặc không lấy đồ vật -> dp[i][w] = max(dp[i-1][w], dp[i-1][w - weight[i]] + val[i]).
    3. Kết quả: Nằm ở ô dp[n][W] với độ phức tạp thời gian là O(n*W).
    03

    Làm thế nào để triển khai và tối ưu hóa thuật toán hoặc cấu trúc dữ liệu liên quan đến LCS & LIS trong chủ đề Dynamic Programming?

    Senior

    Trong lập trình giải thuật với Dynamic Programming, việc làm chủ LCS & LIS yêu cầu lập trình viên hiểu rõ cấu trúc vật lý trong bộ nhớ và độ phức tạp tính toán:

    1. Độ phức tạp: Luôn đánh giá Time Complexity (thời gian) và Space Complexity (không gian) tối ưu nhất (ví dụ: tối ưu từ O(n^2) xuống O(n log n)).
    2. Trường hợp biên (Edge Cases): Xử lý kỹ các giá trị null, mảng rỗng, giá trị giới hạn cực đại/cực tiểu của kiểu dữ liệu.
    3. Mã nguồn mẫu: Triển khai giải pháp rõ ràng, súc tích bằng các cấu trúc dữ liệu cơ bản, tránh lạm dụng bộ nhớ phụ khi không cần thiết.

    vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học