1. Câu lệnh nào sau đây được sử dụng để lặp lại một khối mã nhiều lần, với số lần lặp được xác định trước?
A. If-else statement.
B. While loop.
C. For loop.
D. Switch statement.
2. Khi so sánh thuật toán sắp xếp nhanh (Quick Sort) và thuật toán sắp xếp trộn (Merge Sort), điểm khác biệt chính về cách tiếp cận là gì?
A. Quick Sort sử dụng kỹ thuật chia để trị, còn Merge Sort sử dụng kỹ thuật duyệt tuần tự.
B. Quick Sort chọn một chốt (pivot) và chia mảng xung quanh chốt, còn Merge Sort chia mảng thành hai nửa, sắp xếp chúng và sau đó trộn lại.
C. Merge Sort hiệu quả hơn Quick Sort trong mọi trường hợp.
D. Quick Sort luôn ổn định (stable), còn Merge Sort thì không.
3. Khi nói về độ phức tạp không gian (space complexity) của thuật toán, chúng ta đang đo lường điều gì?
A. Thời gian cần thiết để thuật toán hoàn thành.
B. Lượng bộ nhớ (bao gồm cả bộ nhớ đầu vào và bộ nhớ tạm) mà thuật toán sử dụng.
C. Số lượng phép toán mà thuật toán thực hiện.
D. Độ dễ đọc của mã nguồn thuật toán.
4. Trong lập trình, vòng lặp vô hạn (infinite loop) xảy ra khi nào?
A. Khi điều kiện thoát của vòng lặp luôn đúng.
B. Khi vòng lặp thực hiện quá nhiều lần.
C. Khi vòng lặp được lồng vào nhau.
D. Khi chương trình bị lỗi cú pháp.
5. Đâu là lợi ích chính của việc sử dụng lập trình đệ quy (recursive programming)?
A. Luôn luôn hiệu quả hơn lập trình vòng lặp về tốc độ.
B. Giúp giải quyết các bài toán có cấu trúc lặp lại một cách tự nhiên và dễ đọc, dễ hiểu.
C. Giảm thiểu việc sử dụng bộ nhớ.
D. Chỉ có thể sử dụng với các hàm toán học.
6. Một thuật toán có độ phức tạp thời gian O(n^2) có nghĩa là gì?
A. Thời gian thực thi tăng gấp đôi khi kích thước đầu vào tăng gấp đôi.
B. Thời gian thực thi tăng theo bình phương của kích thước đầu vào.
C. Thời gian thực thi không phụ thuộc vào kích thước đầu vào.
D. Thời gian thực thi giảm khi kích thước đầu vào tăng.
7. Khái niệm mảng (array) trong khoa học máy tính đề cập đến:
A. Một tập hợp các phần tử có kiểu dữ liệu khác nhau.
B. Một tập hợp các phần tử có cùng kiểu dữ liệu, được lưu trữ liên tiếp trong bộ nhớ và có thể truy cập bằng chỉ số.
C. Một cấu trúc dữ liệu động có thể thay đổi kích thước tùy ý.
D. Một tập hợp các cặp khóa-giá trị.
8. Thuật toán tìm kiếm nhị phân (Binary Search) yêu cầu điều kiện tiên quyết nào đối với dữ liệu đầu vào?
A. Dữ liệu phải được sắp xếp theo thứ tự giảm dần.
B. Dữ liệu phải được sắp xếp theo thứ tự tăng dần hoặc giảm dần.
C. Dữ liệu phải được lưu trữ dưới dạng cây.
D. Dữ liệu phải là một mảng động.
9. Trong lập trình hướng đối tượng, tính đa hình (polymorphism) cho phép:
A. Một lớp có thể có nhiều hàm cùng tên nhưng khác tham số.
B. Các đối tượng thuộc các lớp khác nhau có thể phản hồi với cùng một thông điệp (phương thức) theo cách riêng của chúng.
C. Che giấu chi tiết triển khai của một đối tượng.
D. Tạo ra các lớp cha và lớp con.
10. Trong lập trình, kiểu dữ liệu (data type) xác định điều gì?
A. Tên của biến.
B. Phạm vi giá trị mà một biến có thể nhận và các phép toán có thể thực hiện trên biến đó.
C. Thứ tự thực thi của các câu lệnh.
D. Cách thức một chương trình tương tác với người dùng.
11. Đâu là một ví dụ điển hình của cấu trúc dữ liệu cây (Tree)?
A. Danh sách liên kết đơn (Singly Linked List).
B. Hàng đợi ưu tiên (Priority Queue).
C. Cây tìm kiếm nhị phân (Binary Search Tree) dùng để lưu trữ và tìm kiếm dữ liệu có tổ chức.
D. Mảng (Array).
12. Cấu trúc dữ liệu hàng đợi (Queue) hoạt động theo nguyên tắc nào?
A. LIFO (Last In, First Out).
B. FIFO (First In, First Out).
C. Random Access.
D. Tree Traversal.
13. Khái niệm biến (variable) trong lập trình dùng để làm gì?
A. Lưu trữ các câu lệnh thực thi.
B. Định nghĩa các hàm và thủ tục.
C. Đại diện cho một vị trí trong bộ nhớ để lưu trữ dữ liệu có thể thay đổi.
D. Kiểm soát luồng thực thi của chương trình.
14. Trong các cấu trúc điều khiển luồng, câu lệnh rẽ nhánh (branching statement) như if-else được sử dụng để làm gì?
A. Lặp lại một khối mã một số lần nhất định.
B. Thực hiện các khối mã khác nhau dựa trên việc đánh giá một điều kiện logic.
C. Thực thi một khối mã ngay lập tức mà không cần kiểm tra điều kiện.
D. Thoát khỏi vòng lặp hiện tại.
15. Đâu là đặc điểm quan trọng nhất của một thuật toán hiệu quả?
A. Có thể được viết bằng bất kỳ ngôn ngữ lập trình nào.
B. Sử dụng ít bộ nhớ nhất có thể.
C. Có thời gian thực thi và sử dụng tài nguyên tối thiểu, thường được đo bằng độ phức tạp thời gian và không gian.
D. Dễ đọc và dễ hiểu đối với người không chuyên về lập trình.
16. Khái niệm lập trình song song (parallel programming) liên quan đến việc:
A. Viết một chương trình chạy trên nhiều máy tính khác nhau.
B. Thực hiện nhiều phép tính cùng một lúc trên các bộ xử lý hoặc lõi khác nhau để tăng tốc độ xử lý.
C. Sử dụng nhiều ngôn ngữ lập trình trong một dự án.
D. Tự động hóa quá trình viết mã.
17. Cấu trúc dữ liệu nào sau đây cho phép truy cập các phần tử theo nguyên tắc LIFO (Last In, First Out - Vào sau, Ra trước)?
A. Hàng đợi (Queue).
B. Ngăn xếp (Stack).
C. Danh sách liên kết (Linked List).
D. Cây tìm kiếm nhị phân (Binary Search Tree).
18. Độ phức tạp thời gian O(n) (Big O notation) cho biết điều gì về một thuật toán?
A. Thời gian thực thi của thuật toán không thay đổi dù kích thước đầu vào có lớn đến đâu.
B. Thời gian thực thi của thuật toán tăng tuyến tính với kích thước đầu vào n.
C. Thời gian thực thi của thuật toán tăng theo bình phương của kích thước đầu vào n.
D. Thời gian thực thi của thuật toán giảm khi kích thước đầu vào n tăng.
19. Khái niệm đồ thị (graph) trong khoa học máy tính là gì?
A. Một cấu trúc dữ liệu chỉ dùng để lưu trữ số nguyên.
B. Một cấu trúc dữ liệu bao gồm một tập hợp các đỉnh (vertices) và một tập hợp các cạnh (edges) nối các đỉnh đó với nhau.
C. Một cách để biểu diễn dữ liệu dưới dạng bảng hai chiều.
D. Một thuật toán tìm kiếm tuần tự.
20. Trong khoa học máy tính, khái niệm thuật toán được định nghĩa là gì?
A. Một chương trình máy tính được viết bằng ngôn ngữ lập trình cụ thể.
B. Một chuỗi các bước hữu hạn, rõ ràng và có thứ tự để giải quyết một vấn đề hoặc thực hiện một nhiệm vụ.
C. Một cấu trúc dữ liệu dùng để lưu trữ thông tin.
D. Một giao diện người dùng đồ họa (GUI) cho phép tương tác với máy tính.
21. Kỹ thuật chia để trị (divide and conquer) trong thiết kế thuật toán bao gồm những bước chính nào?
A. Gộp các giải pháp nhỏ thành một giải pháp lớn.
B. Chia bài toán lớn thành các bài toán con nhỏ hơn, giải quyết các bài toán con và gộp các kết quả.
C. Xây dựng giải pháp trực tiếp cho bài toán lớn mà không chia nhỏ.
D. Sử dụng vòng lặp để lặp lại một hành động cho đến khi đạt yêu cầu.
22. Trong lập trình hướng đối tượng (OOP), tính đóng gói (encapsulation) là gì?
A. Khả năng một lớp kế thừa thuộc tính và phương thức từ lớp khác.
B. Khả năng che giấu chi tiết triển khai của một đối tượng và chỉ cung cấp giao diện công khai để tương tác.
C. Khả năng một đối tượng có thể có nhiều hình dạng khác nhau.
D. Khả năng tạo ra các lớp trừu tượng mà không thể tạo đối tượng trực tiếp từ chúng.
23. Khi nào thì thuật toán sắp xếp nổi bọt (Bubble Sort) là hiệu quả nhất?
A. Khi danh sách đầu vào có kích thước rất lớn và hoàn toàn ngẫu nhiên.
B. Khi danh sách đầu vào đã được sắp xếp hoặc gần như được sắp xếp.
C. Khi cần sắp xếp các phần tử có giá trị rất lớn.
D. Khi cần một thuật toán có độ phức tạp thời gian không đổi.
24. Đâu là một ví dụ về kiểu dữ liệu trừu tượng (Abstract Data Type - ADT)?
A. Ngôn ngữ lập trình C++.
B. Ngăn xếp (Stack) hoặc Hàng đợi (Queue), định nghĩa các thao tác mà không quy định cách triển khai cụ thể.
C. Biến số nguyên.
D. Vòng lặp for.
25. Trong ngôn ngữ lập trình, hằng số (constant) là gì?
A. Một biến mà giá trị của nó có thể thay đổi bất kỳ lúc nào.
B. Một giá trị không thể thay đổi trong suốt quá trình thực thi chương trình.
C. Một tên đại diện cho một đoạn mã có thể tái sử dụng.
D. Một cấu trúc điều khiển luồng chương trình.