Mở đăng ký khóa học Fullstack qua Zoom. Tham khảo tại đây

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.

Interactive Practice Tổng cộng 4,442 câu hỏi độc bản

Luyện Tập Phỏng Vấn Thử

Mô phỏng áp lực phỏng vấn thật với đồng hồ đếm ngược từng câu, tự đánh giá phản xạ và đo lường độ sẵn sàng của bạn.

Vui lòng đăng nhập để tham gia luyện tập và lưu tiến độ phỏng vấn.
16

Trong JavaScript, tại sao việc sử dụng hàm so sánh (compare function) trong phương thức Array.prototype.sort() lại là bắt buộc khi làm việc với mảng đối tượng (Array of Objects) thay vì chỉ gọi sort() không tham số?

Junior

Khi gọi sort() không tham số, JavaScript sẽ chuyển đổi các phần tử thành chuỗi (string) và so sánh theo thứ tự mã Unicode (UTF-16). Đối với mảng đối tượng, kết quả sẽ là '[object Object]', dẫn đến việc không thể sắp xếp đúng ý đồ. Để sắp xếp mảng đối tượng, bạn phải cung cấp một hàm so sánh (compare function) nhận vào hai tham số a và b. Ví dụ: data.sort((a, b) => a.price - b.price);. Hàm này trả về giá trị âm nếu a < b, dương nếu a > b, và 0 nếu bằng nhau. Đây là tiêu chuẩn để đảm bảo tính chính xác trong logic nghiệp vụ.

17

Khi làm việc với các hệ thống dữ liệu lớn, tại sao thuật toán Insertion Sort lại thường được sử dụng làm thành phần con trong các thuật toán phức tạp hơn như Timsort hoặc QuickSort?

Junior

Insertion Sort có độ phức tạp O(n^2) trong trường hợp xấu nhất, nhưng nó cực kỳ hiệu quả đối với các tập dữ liệu nhỏ (thường dưới 10-20 phần tử) hoặc dữ liệu đã gần như được sắp xếp sẵn. Do chi phí khởi tạo thấp và tính ổn định (stable), các thuật toán hiện đại như Timsort (sử dụng trong V8 engine của Chrome) kết hợp Merge Sort với Insertion Sort để tối ưu hóa hiệu năng trên các phân đoạn nhỏ, giúp giảm thiểu chi phí đệ quy và tối ưu hóa bộ nhớ đệm (cache locality).

18

Tại sao việc sắp xếp dữ liệu trực tiếp trên Database (sử dụng câu lệnh SQL ORDER BY) thường được ưu tiên hơn so với việc lấy dữ liệu về ứng dụng rồi mới thực hiện sắp xếp?

Junior

Việc sắp xếp tại Database tận dụng tối đa các chỉ mục (Index) đã được tối ưu hóa sẵn. Khi dữ liệu lớn, việc truyền tải toàn bộ tập dữ liệu về ứng dụng (Application-level) gây lãng phí băng thông mạng và tiêu tốn bộ nhớ RAM của Server. Ngoài ra, Database có khả năng thực hiện sắp xếp ngoài (External Sorting) nếu dữ liệu vượt quá RAM. Việc dùng ORDER BY kết hợp với LIMIT và OFFSET còn giúp triển khai tính năng phân trang (pagination) hiệu quả, giảm tải cho hệ thống.

19

Trong bài toán sắp xếp danh sách sản phẩm, tại sao việc sử dụng thuật toán sắp xếp không ổn định (Unstable Sorting) có thể gây ra hiện tượng dữ liệu bị nhảy vị trí không mong muốn khi người dùng thực hiện sắp xếp đa tiêu chí?

Junior

Một thuật toán sắp xếp ổn định (Stable Sort) là thuật toán giữ nguyên thứ tự tương đối của các phần tử có giá trị bằng nhau. Nếu thuật toán không ổn định, khi bạn sắp xếp theo tên sản phẩm sau khi đã sắp xếp theo giá, các sản phẩm có cùng giá sẽ bị xáo trộn thứ tự tên ban đầu. Điều này gây trải nghiệm người dùng kém và khó kiểm soát dữ liệu. Trong thực tế, các thư viện chuẩn như Array.prototype.sort() trong các phiên bản ECMAScript mới đã được quy định là ổn định để đảm bảo tính nhất quán này.

20

Khi thiết kế tính năng sắp xếp cho một danh sách hàng triệu bản ghi, tại sao việc sử dụng thuật toán QuickSort có thể dẫn đến rủi ro tràn bộ nhớ (Stack Overflow) và cách khắc phục?

Junior

QuickSort dựa trên cơ chế đệ quy. Nếu chọn phần tử chốt (pivot) không tốt (ví dụ mảng đã sắp xếp sẵn), độ sâu của đệ quy có thể đạt đến O(n), dẫn đến tràn ngăn xếp (Stack Overflow). Để khắc phục, Junior cần: 1. Sử dụng chiến lược chọn pivot ngẫu nhiên hoặc chọn trung vị (median-of-three). 2. Chuyển đổi đệ quy thành vòng lặp với ngăn xếp thủ công. 3. Sử dụng các thuật toán thay thế như Heap Sort (độ phức tạp O(n log n) ổn định và không cần đệ quy sâu) hoặc tận dụng các thư viện đã được tối ưu hóa của ngôn ngữ lập trình.

21

Trong Solidity, tại sao việc sử dụng tx.origin để xác thực quyền sở hữu (Authentication) lại tiềm ẩn rủi ro bảo mật nghiêm trọng?

Junior

Việc sử dụng tx.origin để kiểm tra quyền truy cập là một lỗ hổng bảo mật kinh điển vì nó đại diện cho địa chỉ tài khoản đã khởi tạo giao dịch ban đầu, không phải địa chỉ của Smart Contract đang gọi hàm. Kẻ tấn công có thể tạo một hợp đồng trung gian (Attacker Contract) để lừa người dùng (hoặc chủ sở hữu hợp đồng) thực hiện một giao dịch gọi vào hợp đồng của kẻ tấn công. Khi đó, tx.origin vẫn là địa chỉ của người dùng, khiến các hàm kiểm tra quyền bị vượt qua. Thay vào đó, hãy luôn sử dụng msg.sender để xác thực vì nó đại diện cho thực thể trực tiếp gọi vào hàm hiện tại. Ví dụ: thay vì require(tx.origin == owner), hãy dùng require(msg.sender == owner).

22

Giải thích khái niệm Shadowing trong Solidity và tại sao nó lại gây ra các lỗi logic khó phát hiện trong quá trình phát triển Smart Contract?

Junior

Shadowing xảy ra khi một biến trong phạm vi con (ví dụ: biến cục bộ hoặc biến trong hợp đồng kế thừa) có cùng tên với một biến trong phạm vi cha hoặc phạm vi toàn cục. Điều này khiến trình biên dịch ghi đè hoặc gây nhầm lẫn khi truy xuất giá trị, dẫn đến việc hợp đồng đọc sai dữ liệu lưu trữ. Để tránh điều này, cần tuân thủ quy tắc đặt tên rõ ràng, sử dụng tiền tố (như hoặc m) cho các biến trạng thái hoặc biến tham số. Trình biên dịch Solidity hiện đại sẽ đưa ra cảnh báo (warning) khi phát hiện shadowing; nhà phát triển tuyệt đối không được bỏ qua các cảnh báo này để đảm bảo tính toàn vẹn của dữ liệu.

23

Trong kiến trúc Blockchain, tại sao việc sử dụng các hàm tạo số ngẫu nhiên (Random Number Generation) trực tiếp trong Smart Contract lại không an toàn?

Junior

Blockchain là môi trường tất định (deterministic), nghĩa là mọi node đều phải tính toán ra cùng một kết quả. Các biến như block.timestamp, block.difficulty hay blockhash đều có thể bị thao túng bởi các thợ đào (miners) hoặc validator để thay đổi kết quả ngẫu nhiên theo ý muốn. Để tạo số ngẫu nhiên an toàn trong Enterprise, cần sử dụng các giải pháp Oracle phi tập trung như Chainlink VRF (Verifiable Random Function). Chainlink VRF cung cấp bằng chứng mã hóa chứng minh tính ngẫu nhiên của con số được tạo ra, đảm bảo tính công bằng và không thể bị can thiệp bởi bất kỳ bên nào.

24

Sự khác biệt giữa việc sử dụng Event và lưu trữ dữ liệu trực tiếp vào Storage trong Smart Contract về mặt chi phí Gas là gì?

Junior

Lưu trữ dữ liệu vào Storage (biến trạng thái) là thao tác tốn kém nhất trong Solidity vì dữ liệu được ghi vĩnh viễn vào trạng thái của blockchain và mọi node đều phải lưu trữ. Ngược lại, Event là cơ chế ghi dữ liệu vào log của giao dịch. Dữ liệu trong Event không thể được truy cập bởi các Smart Contract khác, nhưng nó rẻ hơn đáng kể và cho phép các ứng dụng Frontend (thông qua Web3.js hoặc Ethers.js) truy vấn dữ liệu lịch sử một cách hiệu quả. Kinh nghiệm thực chiến là chỉ lưu trữ vào Storage những dữ liệu cần thiết cho logic của hợp đồng, còn lại hãy sử dụng Event để lưu trữ dữ liệu phục vụ mục đích hiển thị hoặc phân tích.

25

Tại sao việc sử dụng modifier trong Solidity lại được coi là một Best Practice để tối ưu hóa code và đảm bảo tính bảo mật?

Junior

Modifier giúp tách biệt logic kiểm tra (validation logic) ra khỏi logic nghiệp vụ chính của hàm, giúp mã nguồn trở nên sạch sẽ, dễ đọc và dễ bảo trì (DRY - Don't Repeat Yourself). Về mặt bảo mật, nó đảm bảo các điều kiện tiên quyết (như kiểm tra quyền, trạng thái hợp đồng) được thực thi nhất quán trước khi code chính của hàm chạy. Nếu không sử dụng modifier, việc lặp lại các câu lệnh require() ở đầu mỗi hàm dễ dẫn đến sai sót hoặc quên kiểm tra trong các bản cập nhật sau này. Ví dụ: modifier onlyOwner { require(msg.sender == owner); _; } giúp đảm bảo tính an toàn cho các hàm quản trị quan trọng.

26

Trong cấu trúc dữ liệu cây, tại sao việc sử dụng đệ quy (Recursion) để duyệt cây có thể dẫn đến lỗi Stack Overflow và làm thế nào để chuyển đổi sang phương pháp duyệt lặp (Iterative) sử dụng Stack thủ công?

Junior

Bản chất vấn đề

Khi duyệt cây bằng đệ quy, mỗi lần gọi hàm, hệ thống sẽ tạo một Stack Frame mới để lưu trữ biến cục bộ và địa chỉ trả về. Nếu cây có độ sâu quá lớn (ví dụ cây bị lệch - Skewed Tree), số lượng Stack Frame sẽ vượt quá dung lượng bộ nhớ Stack được cấp phát, gây ra lỗi Stack Overflow.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
27

Khi thiết kế hệ thống gợi ý từ khóa (Autocomplete), tại sao cấu trúc cây Trie lại tối ưu hơn so với việc lưu trữ danh sách từ khóa trong một mảng hoặc Hash Table?

Junior

Phân tích hiệu năng

  1. Hash Table: Mặc dù tìm kiếm theo khóa chính mất O(1), nhưng không hỗ trợ tìm kiếm tiền tố (Prefix Search) hiệu quả. Để tìm các từ bắt đầu bằng 'uni', bạn phải duyệt qua toàn bộ bảng băm, gây lãng phí tài nguyên.
  2. Mảng: Tìm kiếm nhị phân trên mảng đã sắp xếp mất O(k * log n) với k là độ dài từ. Tuy nhiên, việc chèn thêm từ mới rất tốn kém do phải dịch chuyển phần tử.
  3. Trie (Prefix Tree):
    • Độ phức tạp tìm kiếm là O(m) với m là độ dài của tiền tố, độc lập với số lượng từ có trong tập dữ liệu.
    • Chia sẻ tiền tố chung giữa các từ, giúp tiết kiệm bộ nhớ khi lưu trữ tập từ vựng lớn.

Ứng dụng thực chiến

Trong các hệ thống Enterprise, Trie thường được tối ưu bằng cách sử dụng Compressed Trie (Radix Tree) để giảm số lượng nút trung gian, từ đó giảm thiểu số lần truy cập bộ nhớ (Cache Misses) và tăng tốc độ phản hồi cho người dùng.

28

Trong bài toán tìm kiếm giá trị lớn nhất hoặc nhỏ nhất trong một cây nhị phân tìm kiếm (BST), tại sao chúng ta chỉ cần đi theo một hướng duy nhất thay vì duyệt toàn bộ cây?

Junior

Bản chất của BST

Cây tìm kiếm nhị phân (BST) duy trì tính chất: mọi nút ở nhánh trái đều nhỏ hơn nút gốc, và mọi nút ở nhánh phải đều lớn hơn nút gốc. Tính chất này được bảo toàn đệ quy trên toàn bộ các cây con.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
29

Làm thế nào để xác định một cây nhị phân có phải là cây nhị phân tìm kiếm (BST) hợp lệ hay không? Những lỗi logic nào thường gặp khi lập trình viên Junior giải quyết bài toán này?

Junior

Lỗi logic thường gặp

Nhiều lập trình viên Junior thường chỉ kiểm tra điều kiện: node.left.val < node.val < node.right.val. Cách này sai vì nó không kiểm tra được các nút ở nhánh con xa hơn. Ví dụ: một nút bên phải của gốc có thể nhỏ hơn gốc, vi phạm tính chất BST.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
30

Trong quá trình xóa một nút trong cây nhị phân tìm kiếm (BST), tại sao việc thay thế nút bị xóa bằng giá trị kế nhiệm (In-order Successor) lại được ưu tiên hơn các phương pháp khác?

Junior

Các trường hợp xóa nút

  1. Nút lá: Chỉ cần xóa trực tiếp.
  2. Nút có một con: Thay thế nút đó bằng nút con duy nhất.
  3. Nút có hai con: Đây là trường hợp phức tạp nhất.

Tại sao chọn In-order Successor?

In-order Successor là nút nhỏ nhất trong cây con bên phải. Việc thay thế nút bị xóa bằng giá trị này đảm bảo:

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
High-Ticket Mentoring
Cần Mentor Phỏng Vấn Thử 1-1 & Tối Ưu CV?

Mô phỏng phỏng vấn kỹ thuật thực tế 1-1 qua Google Meet, nhận xét chi tiết điểm mạnh/yếu và sửa CV trực tiếp cùng giảng viên Unicode.

AI Resume Scanner
Kiểm Tra CV Chuẩn ATS Miễn Phí

Tải CV của bạn lên để hệ thống AI rà soát từ khóa kỹ năng, định dạng và tính điểm chuẩn nhà tuyển dụng.

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