Top những câu hỏi phỏng vấn Software Engineer phổ biến

4.5/5 – (2 votes)

Vì nhu cầu tuyển dụng cao nên có rất nhiều buổi phỏng vấn, gặp gỡ với ứng viên cho các vị trí Software Engineers ở Việt Nam. Trong khuôn khổ bài viết này, JobsGO sẽ chia sẻ những câu hỏi phỏng vấn Software Engineer phổ biến và gợi ý cách trả lời để bạn chuẩn bị tốt cho buổi đầu gặp gỡ Nhà tuyển dụng. Đọc ngay nhé!

1. Sự khác nhau giữa mảng (Array) và danh sách liên kết (Linked List)

Sự khác nhau giữa Array và Linked List luôn là một trong những câu hỏi phỏng vấn Software Engineer thường gặp tại nhiều công ty.

Gợi ý trả lời:

So sánh Array Linked List
Cơ bản Là một tập cố định các phần tử Một tập hợp lớn các dữ liệu được sắp xếp theo thứ tự nào đó
Kích thước Cố định, được định nghĩa lúc khai báo Không cần định nghĩa, nó tự lớn lên và thu gọn lại lúc thực thi
Nơi lưu trữ Địa điểm của các thành phần được lưu trữ trong suốt thời gian compile Vị trí của các thành phần được chỉ định ở run time
Thứ tự sắp xếp Được lưu trữ liên tiếp nhau Được lưu trữ ngẫu nhiên
Cách truy cập Trực tiếp hoặc ngẫu nhiên Truy cập một cách tuần tự
Tìm kiếm Tìm kiếm nhị phân và tìm kiếm tuyến tính Tìm kiếm tuyến tính

Bảng 1. Sự khác biệt giữa Linked List và Array.

2. Sự khác nhau giữa Ngăn xếp (Stack) và Hàng đợi (Queue)

Những câu hỏi phỏng vấn Software Engineer thường gặp

Nếu không nắm được những điểm khác nhau giữa Stack và Queue thì bạn chưa thực sự phù hợp với nghề Software Engineer.

Gợi ý trả lời: Có những điểm khác nhau cơ bản giữa Stack và Queue là:

So sánh Stack Queue
Nguyên tắc làm việc LIFO FIFO
Structure Dùng một đầu để chèn và xóa các phần tử dữ liệu Có 2 đầu để xử lý dữ liệu, một đầu chèn một đầu xóa
Số con trỏ được sử dụng Một Hai
Hoạt động được thực hiện Push và Pop Enqueue và dequeue
Biến thể Không có biến thể Có các biến thể như hàng đợi tròn, hàng đợi ưu tiên, hàng đợi kết thúc gấp đôi

Bảng 2. Sự khác biệt giữa Stack và Queue.

3. Sự khác nhau giữa Cây (Tree) và Đồ thị (Graph)

Với những người nghiên cứu về các cấu trúc dữ liệu, từ “Graph” và “Tree” có thể gây ra một số nhầm lẫn.

Gợi ý trả lời:

So sánh Tree Graph
Con đường Chỉ có 1 đường đi Nhiều hơn 1 con đường
Nút gốc Có 1 nút gốc Không có nút gốc
Vòng lặp Không có vòng trong cây Có thể có các vòng lặp
Kỹ thuật truyền tải Đặt hàng trước, theo thứ tự và sau đặt hàng Tìm kiếm theo chiều rộng và chiều sâu
Kiểu mẫu Thứ bậc Mạng

Bảng 3. Sự khác nhau giữa Tree và Graph.

4. Hãy cho biết về giải thuật sắp xếp (Sort)

Gợi ý trả lời:

Thuật toán sắp xếp là phương pháp sắp xếp lại một lượng lớn các mục thành số thứ tự cụ thể từ cao đến thấp hoặc ngược lại. Các thuật toán này lấy một danh sách đầu vào, xử lý nó và tạo ra danh sách đã được sắp xếp.

5. Breadth First Search và Depth First Search là gì?

Đây chắc là câu hỏi “quốc dân” mà các Nhà tuyển dụng thường đề cập đến trong buổi phỏng vấn Software Engineer.

Gợi ý trả lời:

  • Breadth First Search – Tìm kiếm theo chiều rộng: Là một kỹ thuật dựa trên đỉnh để tìm đường đi ngắn nhất trong đồ thị. Nó sử dụng cấu trúc dữ liệu hàng đợi First In First Out.
  • Depth First Search – Tìm kiếm theo chiều sâu: Là một thuật toán tìm hoặc duyệt đồ thị/cây theo chiều sâu. Việc thực thi thuật toán bắt đầu ở nút gốc và khám phá từng nhánh trước khi quay ngược.

6. Cho một danh sách số nguyên (integers), làm sao để kiểm tra xem một số bất kỳ có tồn tại trong danh sách đó?

Gợi ý trả lời: Có hai cách để kiểm tra xem một số bất kỳ có tồn tại trong danh sách hay không:

  • Sử dụng Linear Search (Tìm kiếm tuyến tính).
  • Sử dụng Binary Search (Tìm kiếm nhị phân).

7. Tìm một số đảo ngược của một số

Câu hỏi thường gặp khi phỏng vấn Software Engineer

Đây là một trong những câu hỏi phỏng vấn Software Engineer cơ bản giúp đánh giá tư duy lập trình và khả năng giải quyết các bài toán của ứng viên.

Gợi ý trả lời:

  • Giả sử n = 12345. Khi đó ta có thể viết n = 1*105 + 2*104 + 3*103 + 4*102 + 5*101.
  • Vậy số ngược lại của n = 54321 có thể viết thành 5*105 + 4*104 + 3*103 + 2*102 + 1*101.

8. HashTable (bảng băm) là gì?

Gợi ý trả lời: Bảng băm hay HashTable là một cấu trúc mà khi người dùng thực hiện truy xuất một phần tử qua khóa thì nó sẽ được ánh xạ vào thông qua hàm băm (Hash Function).

9. Các thuật toán sắp xếp dựa trên so sánh

Gợi ý trả lời: Bất kỳ thuật toán sắp xếp dựa trên so sánh nào cũng phải mất thời gian để sắp xếp một mảng gồm n phần tử trong trường hợp xấu nhất:

  • Bubble Sort : so sánh các phần tử để đặt các phần tử lớn nhất vào vị trí cuối cùng.
  • Selection Sort: so sánh các phần tử để đặt các phần tử nhỏ nhất vào vị trí phía trước.
  • Insertion Sort: so sánh các phần tử để quyết định vị trí của một phần tử trong mảng đã được sắp xếp một phần.
  • Merge Sort: so sánh các phần tử của hai phần tử đã sắp xếp để hợp nhất chúng thành mảng được sắp xếp cuối cùng.
  • Quicksort: so sánh các phần tử của phân vùng mảng chưa được sắp xếp thành hai nửa khác nhau xung quanh giá trị pivot.
  • Heapsort: so sánh các phần tử trong quá trình heapify để đặt các phần tử nhỏ nhất lên phía trước của mảng (Nếu chúng ta đang sử dụng Min-heap).

10. Hãy cho biết về cách duyệt cây: Inorder vs Preorder vs Postorder

Gợi ý trả lời: Những cách thường được sử dụng để đi ngang qua cây:

  • Duyệt tiền thứ tự (Preorder Traversal): Nút gốc -> cây con bên trái -> cây con bên phải.
  • Duyệt trung thứ tự (Inorder Traversal): Cây con bên trái -> nút gốc -> cây con bên phải.
  • Duyệt hậu thứ tự (Postorder Traversal): Cây con bên trái -> cây con bên phải -> nút gốc.

11. Độ phức tạp thời gian (Time Complexity) và Độ phức tạp bộ nhớ (Space Complexity) là gì? Hãy cho ví dụ

Những câu hỏi phỏng vấn Software Engineer tổng quát nên không quá khó, tuy nhiên bạn cũng cần đảm bảo câu trả lời chỉn chu để có được khởi đầu thuận lợi.

Gợi ý trả lời:

Giải thích Time Complexity Space Complexity
Định nghĩa Là sự thể hiện lượng thời gian mà thuật toán cần để thực thi đến khi hoàn thành. Là một thước đo cho các thuật toán cần bao nhiêu không gian lưu trữ liên quan đến đầu vào của nó.
Ví dụ Bài toán tìm phần tử lớn nhất trong một mảng.

Chúng ta sẽ phải chạy vòng lặp trên toàn bộ các phần tử của mảng đó => Time Complexity.

Chúng ta tạo 1 mảng chứa 20 phần tử.

Vì Space complexity dựa vào số phần tử của mảng nên nếu số lượng phần tử tăng lên (21, 22,… phần tử) thì bộ nhớ yêu cầu sẽ tăng lên.

Bảng 4. Tìm hiểu về Time Complexity và Space Complexity.

12. Binary Search là gì?

Nhà tuyển dụng hỏi bạn câu hỏi này để đánh giá bạn có nắm được những kiến thức cơ bản về Software Engineer hay không.

Gợi ý trả lời: Binary Search (Tìm kiếm nhị phân) là một thuật toán tìm kiếm tuyến tính cao cấp với thời gian chạy là O(logN). Đối với các danh sách lớn, thuật toán này tốt hơn hẳn tìm kiếm tuyến tính, nhưng nó đòi hỏi danh sách phải được sắp xếp từ trước và đòi hỏi khả năng truy nhập ngẫu nhiên.

13. Hãy giải thích về kỹ thuật hai con trỏ (Two Pointers)

Gợi ý trả lời: Two Pointer là kỹ thuật sử dụng hai con trỏ để di chuyển trên một danh sách/mảng/chuỗi để thực hiện các thao tác tìm kiếm trong một vòng lặp trên cấu trúc dữ liệu. Nó bao gồm hai biến thể:

  • Opposite-Directional: Mỗi con trỏ được đặt ở hai đầu của mảng và di chuyển về phía nhau cho đến khi gặp nhau.
  • Equi-Directional: Mỗi con trỏ đều bắt đầu ở đầu mảng, một con là con trỏ di chuyển chậm trong khi con còn lại là con trỏ nhanh hơn.

14. Prefix Sum là gì?

Gợi ý trả lời: Prefix Sum là một kỹ thuật “lưu vết” tổng của một tập hợp số đứng trước một phần tử trong dãy có thứ tự. Ý tưởng là tạo một mảng prefix trong đó prefix[i] là tổng của tất cả các phần tử tính đến chỉ số i (đã bao gồm cả phần tử tại i).

Ví dụ: cho nums = [5, 2, 1, 6, 3, 8], ta sẽ có prefix = [5, 7, 8, 14, 17, 25].

Một số câu hỏi phỏng vấn vị trí Software Engineer

15. Phân biệt Cây nhị phân (Binary Tree) và Cây nhị phân tìm kiếm (Binary Search Tree)

Đây là cũng là một trong những câu hỏi phỏng vấn Software Engineer thường gặp.

Gợi ý trả lời:

So sánh Binary Tree Binary Search Tree
Định nghĩa Là một kiểu cấu trúc dữ liệu, trong đó một nút cha có thể có tối đa hai nút con.
  • Là cây nhị phân, trong đó: Nút con bên trái chỉ chứa các nút có giá trị nhỏ hơn hoặc bằng nút mẹ.
  • Nút con bên phải chỉ chứa các nút có giá trị lớn hơn nút mẹ.
Thứ tự sắp xếp dữ liệu Không có thứ tự cụ thể để sắp xếp các phần tử dữ liệu. Có một thứ tự cụ thể để sắp xếp các phần tử dữ liệu.
Sử dụng Được sử dụng như một dạng tra cứu dữ liệu và thông tin hiệu quả trong cấu trúc cây. Được sử dụng để chèn, xóa và tìm kiếm dữ liệu.

Bảng 5. Phân biệt Binary Tree và Binary Search Tree.

16. OOP là gì? Tại sao chúng ta nên sử dụng OOP?

Gợi ý trả lời: OOP viết tắt của Object-Oriented Programming. Đây là một mô hình lập trình dựa trên khái niệm về lớp (Classes) và đối tượng (Objects).

Một số ưu điểm của OOP mà bạn nên đề cập để Nhà tuyển dụng thấy bạn nắm rõ về kiểu lập trình này như thế nào:

  • Nhanh và dễ thực thi.
  • Cung cấp một cấu trúc rõ ràng cho các chương trình.
  • Giữ cho câu lệnh không bị lặp lại và dễ bảo trì, sửa đổi, gỡ lỗi.
  • Tạo các ứng dụng có thể tái sử dụng với ít code hơn và thời gian phát triển ngắn hơn.

17. Tại sao Constructor không trả về giá trị nào?

Gợi ý trả lời: Các Constructors được sử dụng để khởi tạo trạng thái của Object. Giống như các Method, một Constructor cũng chứa tập hợp các câu lệnh (tức là các lệnh) được thực thi tại thời điểm tạo Object nên nó không trả về giá trị nào.

18. Hãy giải thích khái niệm Polymorphism?

Gợi ý trả lời: Polymorphism (đa hình) là một khái niệm lập trình hướng đối tượng đề cập đến khả năng của một biến, hàm hoặc đối tượng có nhiều dạng.

Polymorphism thể hiện tính đa hình, các đối tượng lớp thuộc cùng một cây phân cấp (kế thừa từ một lớp cha chung) có thể có các hàm có cùng tên.

19. Design Patterns là gì? Tại sao chúng ta cần dùng Design Patterns?

Gợi ý trả lời: Design Pattern (mẫu thiết kế) cung cấp một giải pháp chung có thể tái sử dụng cho các vấn đề xảy ra trong thiết kế phần mềm.

Các Design Patterns có hai lợi ích chính:

  • Tạo điều kiện thuận lợi cho việc phát triển các mô-đun có tính gắn kết cao với khớp nối tối thiểu.
  • Giúp giao tiếp giữa các nhà thiết kế hiệu quả hơn.

20. Hãy mô tả mô hình MVC. Đưa ra cách giải quyết vấn đề “Massive Controller”

Gợi ý trả lời: Mô hình MVC là một Architectural Pattern phân tách một ứng dụng thành ba thành phần logic chính: model, view, và controller. Mỗi thành phần này được xây dựng để xử lý các khía cạnh phát triển cụ thể của một ứng dụng.

Để giải quyết vấn đề Massive Controller, chúng ta cần sử dụng Container View và Child View Controller.

Những câu hỏi phỏng vấn Software Engineer trên đây sẽ giúp bạn chuẩn bị tốt cho quá trình tìm kiếm công việc ngành này. Nếu bạn có câu hỏi nào khác có thể chia sẻ, hãy để lại bên dưới phần bình luận nhé!

Leave a Reply

Your email address will not be published. Required fields are marked *