1. Khái niệm thuật toán (algorithm) trong khoa học máy tính được định nghĩa là gì?
A. Một tập hợp các bước hoặc quy tắc được xác định rõ ràng để giải quyết một vấn đề hoặc thực hiện một tác vụ.
B. Một ngôn ngữ lập trình được sử dụng để viết mã.
C. Một thiết bị phần cứng dùng để xử lý dữ liệu.
D. Một giao diện người dùng đồ họa.
2. Khái niệm đóng gói (encapsulation) trong lập trình hướng đối tượng đề cập đến việc gì?
A. Buộc các thành phần dữ liệu (thuộc tính) và các phương thức thao tác dữ liệu đó vào chung một đơn vị (lớp), đồng thời ẩn đi chi tiết triển khai.
B. Cho phép một đối tượng có thể mang nhiều hình thái khác nhau.
C. Tái sử dụng mã nguồn từ các lớp đã có.
D. Chia nhỏ chương trình thành nhiều module nhỏ hơn.
3. Cấu trúc dữ liệu nào cho phép thêm và xóa phần tử ở cả hai đầu, được gọi là hai đầu (double-ended)?
A. Deque (Double-ended Queue)
B. Ngăn xếp (Stack)
C. Hàng đợi ưu tiên (Priority Queue)
D. Danh sách liên kết vòng (Circular Linked List)
4. Khái niệm debug trong lập trình đề cập đến hoạt động nào?
A. Tìm kiếm và sửa lỗi trong mã nguồn chương trình.
B. Viết mã nguồn mới cho một chức năng.
C. Tối ưu hóa hiệu suất của chương trình.
D. Thiết kế giao diện người dùng.
5. Cấu trúc dữ liệu nào cho phép truy cập các phần tử theo nguyên tắc Vào sau, Ra trước (Last-In, First-Out - LIFO)?
A. Ngăn xếp (Stack)
B. Hàng đợi (Queue)
C. Danh sách liên kết (Linked List)
D. Cây (Tree)
6. Khi một chương trình gặp lỗi segmentation fault hoặc access violation, nguyên nhân phổ biến nhất là gì?
A. Truy cập vào một vùng bộ nhớ không hợp lệ hoặc không được cấp phép.
B. Vòng lặp vô hạn không có điểm dừng.
C. Sử dụng quá nhiều biến toàn cục.
D. Thiếu câu lệnh `return` trong hàm.
7. Khái niệm tính đa hình (polymorphism) trong lập trình hướng đối tượng cho phép?
A. Các đối tượng thuộc các lớp khác nhau có thể phản ứng với cùng một thông điệp (message) theo cách riêng của chúng.
B. Một lớp có thể kế thừa thuộc tính từ nhiều lớp cha.
C. Mã nguồn của chương trình được ẩn khỏi người dùng.
D. Dữ liệu và phương thức được đóng gói trong một lớp.
8. Khi nói về các ngôn ngữ lập trình bậc cao, mục đích chính của việc sử dụng chúng là gì?
A. Giúp lập trình viên viết mã dễ hiểu, gần gũi với ngôn ngữ con người hơn.
B. Yêu cầu lập trình viên phải hiểu sâu về kiến trúc phần cứng máy tính.
C. Tăng tốc độ thực thi của chương trình lên mức tối đa.
D. Giảm dung lượng bộ nhớ mà chương trình sử dụng.
9. Một thuật toán sắp xếp Quick Sort có độ phức tạp thời gian trung bình là O(n log n). Tuy nhiên, trong trường hợp xấu nhất, độ phức tạp có thể lên tới O(n^2). Nguyên nhân của trường hợp xấu nhất thường là gì?
A. Việc chọn điểm xoay (pivot) không hiệu quả, dẫn đến việc chia mảng không cân đối.
B. Dữ liệu đầu vào đã được sắp xếp hoàn toàn.
C. Sử dụng quá nhiều bộ nhớ đệm.
D. Thuật toán thực hiện quá nhiều phép hoán vị.
10. Thuật toán sắp xếp nào có độ phức tạp thời gian trung bình là O(n log n) và thường hiệu quả cho các tập dữ liệu lớn?
A. Sắp xếp trộn (Merge Sort)
B. Sắp xếp nổi bọt (Bubble Sort)
C. Sắp xếp chọn (Selection Sort)
D. Sắp xếp chèn (Insertion Sort)
11. Một thuật toán tìm kiếm tuyến tính (linear search) có độ phức tạp thời gian là O(n). Điều này có nghĩa là gì?
A. Thời gian thực thi tăng tuyến tính với kích thước của tập dữ liệu đầu vào.
B. Thời gian thực thi không phụ thuộc vào kích thước của tập dữ liệu.
C. Thời gian thực thi tăng theo bình phương kích thước của tập dữ liệu.
D. Thời gian thực thi giảm tuyến tính khi kích thước tập dữ liệu tăng.
12. Trong các kiểu dữ liệu cơ bản, kiểu dữ liệu nào thường được sử dụng để biểu diễn các số nguyên không có phần thập phân?
A. Integer (int)
B. Float (float)
C. Boolean (bool)
D. Character (char)
13. Cấu trúc dữ liệu nào cho phép thêm và xóa phần tử chỉ từ một đầu, thường là đầu cuối (end) của danh sách?
A. Ngăn xếp (Stack)
B. Hàng đợi (Queue)
C. Danh sách liên kết kép (Doubly Linked List)
D. Bảng băm (Hash Table)
14. Trong lập trình, hằng số (constant) là gì và mục đích sử dụng của nó?
A. Một giá trị không thể thay đổi trong suốt quá trình thực thi chương trình, giúp tăng tính rõ ràng và dễ bảo trì.
B. Một biến có giá trị được khởi tạo một lần và không bao giờ được thay đổi.
C. Một biến chỉ được sử dụng trong một phạm vi nhất định của chương trình.
D. Một cách để định nghĩa các kiểu dữ liệu phức tạp.
15. Cấu trúc dữ liệu nào cho phép lưu trữ dữ liệu dưới dạng cây, với mỗi nút có thể có hai nút con là nút trái và nút phải?
A. Cây nhị phân (Binary Tree)
B. Danh sách liên kết (Linked List)
C. Hàng đợi (Queue)
D. Ngăn xếp (Stack)
16. Cấu trúc dữ liệu nào cho phép lưu trữ các phần tử có cùng kiểu dữ liệu và truy cập chúng bằng một chỉ số (index)?
A. Mảng (Array)
B. Danh sách liên kết (Linked List)
C. Ngăn xếp (Stack)
D. Cây nhị phân (Binary Tree)
17. Cấu trúc dữ liệu nào cho phép truy cập các phần tử theo nguyên tắc Vào trước, Ra trước (First-In, First-Out - FIFO)?
A. Hàng đợi (Queue)
B. Ngăn xếp (Stack)
C. Danh sách liên kết (Linked List)
D. Mảng (Array)
18. Cấu trúc dữ liệu nào lưu trữ các cặp khóa-giá trị (key-value pairs) và cho phép tra cứu giá trị dựa trên khóa một cách hiệu quả?
A. Bảng băm (Hash Table) hoặc Từ điển (Dictionary)
B. Danh sách liên kết (Linked List)
C. Mảng (Array)
D. Ngăn xếp (Stack)
19. Trong lập trình, khái niệm nào đề cập đến việc đóng gói dữ liệu và các phương thức xử lý dữ liệu đó thành một đơn vị duy nhất, được gọi là đối tượng?
A. Lập trình hướng đối tượng (OOP)
B. Lập trình cấu trúc
C. Lập trình hàm
D. Lập trình tuần tự
20. Trong lập trình, biến (variable) được sử dụng để làm gì?
A. Lưu trữ dữ liệu có thể thay đổi trong quá trình thực thi chương trình.
B. Định nghĩa các hàm hoặc phương thức trong chương trình.
C. Xác định cấu trúc điều khiển như vòng lặp và câu lệnh điều kiện.
D. Quản lý bộ nhớ cấp phát tĩnh cho chương trình.
21. Trong lập trình hướng đối tượng, kế thừa (inheritance) cho phép một lớp mới (lớp con) thừa hưởng các thuộc tính và phương thức từ một lớp đã có (lớp cha). Mục đích chính của kế thừa là gì?
A. Tái sử dụng mã và tạo ra mối quan hệ phân cấp giữa các lớp.
B. Tăng tốc độ thực thi của chương trình.
C. Giảm dung lượng bộ nhớ chương trình sử dụng.
D. Đảm bảo tính bảo mật của dữ liệu.
22. Trong lập trình, kiểu dữ liệu (data type) dùng để chỉ điều gì?
A. Loại giá trị mà một biến có thể lưu trữ và các phép toán có thể thực hiện trên giá trị đó.
B. Tên định danh của một biến.
C. Cấu trúc của một vòng lặp.
D. Phạm vi truy cập của một biến.
23. Trong lập trình, hàm (function) hay phương thức (method) được sử dụng để làm gì?
A. Đóng gói một khối mã thực hiện một nhiệm vụ cụ thể, có thể gọi lại nhiều lần.
B. Lưu trữ dữ liệu tạm thời trong bộ nhớ.
C. Xác định các thuộc tính của một đối tượng.
D. Thiết lập kết nối mạng.
24. Độ phức tạp thời gian O(1) của một thuật toán có nghĩa là gì?
A. Thời gian thực thi không đổi, bất kể kích thước đầu vào.
B. Thời gian thực thi tăng tuyến tính với kích thước đầu vào.
C. Thời gian thực thi tăng theo hàm logarit.
D. Thời gian thực thi giảm dần khi kích thước đầu vào tăng.
25. Khái niệm tính trừu tượng (abstraction) trong khoa học máy tính đề cập đến việc gì?
A. Tập trung vào các khía cạnh quan trọng và bỏ qua các chi tiết không cần thiết.
B. Đóng gói dữ liệu và phương thức vào một lớp.
C. Cho phép các đối tượng khác nhau phản ứng với cùng một thông điệp.
D. Tái sử dụng mã nguồn.