50 câu hỏi phỏng vấn và câu trả lời hàng đầu của Array (2026)

Bạn đang chuẩn bị cho buổi phỏng vấn tại Array? Đã đến lúc tập trung vào những câu hỏi có thể được đặt ra. Hiểu rõ {{keyword}} giúp ứng viên bộc lộ điểm mạnh về tư duy phân tích, logic và khả năng giải quyết vấn đề một cách hiệu quả.

Mảng là nền tảng kinh nghiệm kỹ thuật và kinh nghiệm chuyên môn cho các lập trình viên. Từ những người mới vào nghề đến các chuyên gia cấp cao, việc thành thạo mảng thể hiện chuyên môn kỹ thuật vững chắc và kinh nghiệm sâu sắc trong thao tác dữ liệu. Nhà tuyển dụng đánh giá cao những kỹ năng này trong các buổi hỏi đáp, giúp họ hiểu rõ hơn về mảng.ping Các ứng viên vượt qua các vòng thi thông thường, nâng cao hoặc vấn đáp với khả năng phân tích tự tin và kỹ năng thực tiễn xuất sắc.

Dựa trên những hiểu biết sâu sắc từ hơn 85 nhà lãnh đạo kỹ thuật, nhà quản lý và chuyên gia, bộ sưu tập này bao gồm nhiều góc nhìn đa dạng trong nhiều ngành, đảm bảo mỗi chủ đề phản ánh kỳ vọng tuyển dụng thực tế và các tiêu chuẩn đánh giá mã hóa trong thế giới thực.

Câu hỏi và câu trả lời phỏng vấn mảng

Những câu hỏi và câu trả lời phỏng vấn hàng đầu của Array

1) Giải thích mảng là gì và nó khác với các cấu trúc dữ liệu khác như thế nào.

Mảng là một khối bộ nhớ liền kề lưu trữ nhiều phần tử cùng kiểu dữ liệu. Nó cho phép truy cập liên tục đến bất kỳ phần tử nào bằng chỉ mục của nó, khiến nó trở thành một trong những cấu trúc hiệu quả nhất cho truy cập ngẫu nhiên. Không giống như danh sách liên kết, mảng có kích thước cố định và không tốn chi phí lưu trữ con trỏ. Mảng được ưu tiên sử dụng khi số lượng phần tử đã được biết trước, trong khi các cấu trúc động như danh sách hoặc vectơ được sử dụng khi cần thay đổi kích thước thường xuyên.

Tính năng Mảng Danh sách liên kết
Cấp phát bộ nhớ Tiếp giáp Không liền kề
Thời gian truy cập O (1) O (n)
Chèn/Xóa Tốn kém Có hiệu quả
Chi phí bộ nhớ Thấp Cao (con trỏ)

👉 Tải xuống PDF miễn phí: Câu hỏi và câu trả lời phỏng vấn Array


2) Có những loại mảng nào? Hãy đưa ra ví dụ.

Mảng được phân loại dựa trên kích thước và cách sử dụng. Các loại chính bao gồm:

  • Mảng một chiều: Lưu trữ các phần tử theo tuyến tính, ví dụ: int arr[5] = {1,2,3,4,5}.
  • Mảng hai chiều: Biểu diễn dữ liệu dạng bảng, ví dụ như ma trận.
  • Mảng đa chiều: Kích thước cao hơn, thường được sử dụng trong mô phỏng hoặc xử lý hình ảnh.
  • Mảng động: Tự động thay đổi kích thước khi các thành phần được thêm vào, ví dụ: ArrayList in Java, vector in C++.
Kiểu Structure Ví dụ
1D tuyến tính [1, 2, 3]
2D Matrix [[1, 2], [3, 4]]
Năng động Có thể thay đổi kích thước std::vector<int>

3) Làm thế nào để tìm phần tử lớn nhất và nhỏ nhất trong một mảng?

Bài toán này thường được giải quyết bằng cách duyệt tuyến tính. Bạn duy trì hai biến — một cho giá trị nhỏ nhất và một cho giá trị lớn nhất — và cập nhật chúng trong quá trình lặp.

Thuật toán:

  1. khởi min và max với phần tử đầu tiên.
  2. Duyệt mảng và so sánh từng phần tử.
  3. Cập nhật min or max cho phù hợp.

Ví dụ (C++):

int arr[] = {5, 2, 9, 1, 7};
int min = arr[0], max = arr[0];
for (int i : arr) {
    if (i < min) min = i;
    if (i > max) max = i;
}

Độ phức tạp về thời gian: TRÊN).


4) Ưu điểm và nhược điểm của mảng là gì?

Mảng cung cấp hiệu suất cao cho việc truy cập ngẫu nhiên nhưng có kích thước cố định và việc thay đổi kích thước tốn kém.

Yếu tố Ưu điểm Nhược điểm
HIỆU QUẢ Lập chỉ mục nhanh (O(1)) Chèn/xóa chậm (O(n))
Bộ nhớ Lưu trữ nhỏ gọn Phân bổ kích thước tĩnh
Triển khai hệ thống Cú pháp đơn giản Không có giới hạn kiểm tra trong một số ngôn ngữ
Trường hợp sử dụng Phù hợp với các tập dữ liệu cố định Không hiệu quả khi phải sửa đổi thường xuyên

5) Mô tả sự khác biệt giữa mảng tĩnh và mảng động.

A mảng tĩnh có kích thước cố định được xác định tại thời điểm biên dịch, trong khi mảng động có thể mở rộng hoặc thu hẹp trong thời gian chạy. Mảng tĩnh hiệu quả về mặt bộ nhớ nhưng cứng nhắc, trong khi mảng động mang lại sự linh hoạt với chi phí nhỏ về chi phí thay đổi kích thước.

Tính năng Mảng tĩnh Mảng động
Kích thước máy đã sửa Biến
Bộ nhớ Sắp xếp ban ơn
Ví dụ int arr[5]; std::vector<int>
Thay đổi kích thước Không được hỗ trợ Hỗ trợ

Trường hợp sử dụng mẫu:
Sử dụng mảng tĩnh trong hệ thống nhúng và mảng động cho các bộ sưu tập có kích thước không thể đoán trước.


6) Làm thế nào để đảo ngược một mảng tại chỗ?

RevXóa một mảng tại chỗ liên quan đến việc hoán đổi.ping Các yếu tố từ cả hai đầu di chuyển về phía trung tâm.

Thuật toán:

  1. Khởi tạo hai con trỏ: start = 0 và end = n - 1.
  2. Hoán đổi các yếu tố arr[start] và arr[end].
  3. Tăng start và giảm end cho đến khi họ gặp nhau.

Ví dụ (Python):

arr = [1, 2, 3, 4, 5]
arr.reverse()  # Built-in method
# or manually
arr = arr[::-1]

Độ phức tạp về thời gian: TRÊN), Không gian phức tạp: O(1).


7) Sự khác biệt giữa mảng răng cưa và mảng đa chiều là gì?

A mảng lởm chởm là một mảng của các mảng trong đó các mảng bên trong có thể có độ dài khác nhau, trong khi một mảng đa chiều có kích thước hàng và cột đồng nhất.

Tính năng Mảng răng cưa Mảng đa chiều
Structure Không đều (mảng lồng nhau) Hình chữ nhật (ma trận)
Bộ nhớ Không liền kề Tiếp giáp
Truy Cập arr[i][j] arr[i][j]
Ví dụ int[][] jagged = {{1,2}, {3,4,5}}; int[,] matrix = {{1,2}, {3,4}};

Mảng răng cưa sử dụng bộ nhớ hiệu quả hơn khi dữ liệu không đồng đều.


8) Làm thế nào để tìm số còn thiếu trong mảng từ 1 đến n?

Bài toán này tận dụng các tính chất toán học của số tự nhiên.

Cách tiếp cận 1 (Công thức tổng):
Tổng của đầu tiên n số tự nhiên = n*(n+1)/2.

Subtract là tổng của các phần tử mảng từ tổng này.

Cách tiếp cận 2 (XOR):
XOR tất cả các phần tử có số từ 1 đến n. Giá trị còn lại là số bị thiếu.

Ví dụ:
Trong cáp [1,2,4,5,6] (n=6):

Tổng dự kiến ​​= 21, Tổng thực tế = 18 → Thiếu = 3.

Độ phức tạp về thời gian: TRÊN), Không gian phức tạp: O(1).


9) Có những cách nào để loại bỏ phần tử trùng lặp khỏi mảng?

Có một số cách tiếp cận tùy thuộc vào ngôn ngữ và hạn chế:

  • Sử dụng HashSet: Chỉ lưu trữ những thành phần duy nhất.
  • Sử dụng Sắp xếp: Sắp xếp mảng và loại bỏ các phần tử trùng lặp liền kề.
  • Sử dụng Bản đồ tần suất: Track số lượng của mỗi phần tử.

Ví dụ (Java):

Set<Integer> unique = new HashSet<>(Arrays.asList(arr));
Phương pháp tiếp cận Thời gian Không gian
Bộ băm O (n) O (n)
Phân loại O (n log n) O (1)
Tần số O (n) O (n)

10) Làm thế nào để tìm phần tử lớn thứ hai trong một mảng?

Bạn có thể tìm phần tử lớn thứ hai bằng cách duyệt một lần bằng cách duy trì hai biến.

Thuật toán:

  1. khởi first và second as INT_MIN.
  2. Duyệt qua mảng.
  3. Cập nhật cả hai khi tìm thấy giá trị lớn hơn.

Ví dụ (C++):

int first = INT_MIN, second = INT_MIN;
for (int x : arr) {
    if (x > first) {
        second = first;
        first = x;
    } else if (x > second && x < first) {
        second = x;
    }
}

Độ phức tạp về thời gian: TRÊN), Không gian phức tạp: O(1).


11) Làm thế nào để xoay một mảng theo 'k' vị trí? Giải thích các cách tiếp cận khác nhau.

Phép quay mảng dịch chuyển các phần tử theo chu kỳ. Có ba phương pháp chính Để đạt được nó:

  1. Sử dụng Mảng tạm thời: Sao chép k phần tử đầu tiên và thêm chúng vào cuối sau khi dịch chuyển các phần tử khác.
  2. Sử dụng RevThuật toán ersal: Reverse Mảng gồm ba phần – phần đầu tiên, phần thứ hai, rồi toàn bộ mảng.
  3. Sử dụng thuật toán tung hứng: Dựa trên GCD của n và k (hiệu quả trong O(n)).

Ví dụ (Xoay phải 2 lần):

Input: [1,2,3,4,5]
Output: [4,5,1,2,3]
Phương pháp Thời gian Không gian Mô tả Chi tiết
Mảng tạm thời O (n) Được rồi) Đơn giản và trực quan
Reversal O (n) O (1) Tại chỗ và hiệu quả
Tung hứng O (n) O (1) Dựa trên chu kỳ GCD

12) Mảng con là gì và nó khác với chuỗi con như thế nào?

A mảng con là một phần liền kề của một mảng, trong khi một dãy con duy trì thứ tự nhưng có thể bỏ qua các yếu tố.

Bất động sản Mảng con Tiếp theo
Tiếp giáp Có Không
Đơn hàng được bảo quản Có Có
Ví dụ (từ [1,2,3]) [1,2] [1,3]

Ví dụ:
Mảng đã cho [1,2,3], tổng số mảng con = n*(n+1)/2 = 6.

Mặt khác, các dãy con là 2ⁿ - 1 = 7 các tổ hợp không rỗng.


13) Làm thế nào để tìm mảng con có tổng lớn nhất?

Thuật toán của Kadane là cách hiệu quả nhất để tìm mảng con liền kề có tổng lớn nhất.

Bước sau:

  1. khởi max_current = max_global = arr[0].
  2. Lặp lại qua các phần tử.
  3. Cập nhật max_current = max(arr[i], arr[i] + max_current).
  4. Track là giá trị cực đại toàn cầu.

Ví dụ:
Đầu vào: [-2,1,-3,4,-1,2,1,-5,4] → Đầu ra: 6 (mảng con [4,-1,2,1]).

Phức tạp:
O(n) thời gian, O(1) không gian.


14) Làm thế nào để có thể hợp nhất hai mảng đã sắp xếp mà không sử dụng thêm không gian?

Để hợp nhất hai mảng đã được sắp xếp tại chỗ, ý tưởng là so sánh từ cuối cả hai mảng.

Tiếp cận:

  1. Bắt đầu từ phần tử hợp lệ cuối cùng của cả hai mảng.
  2. So sánh và di chuyển ô lớn hơn đến cuối khoảng trống kết hợp.
  3. Lặp lại cho đến khi tất cả các phần tử được hợp nhất.

Ví dụ (C++):

int i = m-1, j = n-1, k = m+n-1;
while (i >= 0 && j >= 0) {
    if (A[i] > B[j]) A[k--] = A[i--];
    else A[k--] = B[j--];
}

Độ phức tạp về thời gian: O(m+n).


15) Có những cách nào để tìm kiếm một phần tử trong mảng?

Phương pháp Kiểu Thời gian phức tạp Sử dụng ví dụ
Tìm kiếm tuyến tính Chưa sắp xếp O (n) Tìm kiếm chung
Tìm kiếm nhị phân sắp xếp O (log n) Tra cứu hiệu quả
Băm Không có thứ tự O(1) trung bình tập dữ liệu lớn

Ví dụ (Tìm kiếm nhị phân – Python):

def binary_search(arr, x):
    l, r = 0, len(arr)-1
    while l <= r:
        mid = (l+r)//2
        if arr[mid] == x: return mid
        elif arr[mid] < x: l = mid+1
        else: r = mid-1
    return -1

16) Giải thích sự khác biệt giữa sao chép nông và sao chép sâu trong mảng.

A bản sao cạn sao chép các tham chiếu đến các yếu tố gốc, trong khi một bản sao sâu sao chép toàn bộ dữ liệu vào các vị trí bộ nhớ mới.

Sao chép Loại Độc lập dữ liệu Ví dụ
Không sâu Không arr_copy = arr
Sâu Có arr_copy = arr[:] (Python)

Ví dụ:
Việc sửa đổi bản sao nông sẽ phản ánh trong mảng gốc; bản sao sâu thì không.


17) Làm thế nào để tìm các phần tử trùng lặp trong một mảng mà không sử dụng thêm không gian?

Cách tiếp cận 1 (Sắp xếp): Sắp xếp và kiểm tra các phần tử liền kề.

Cách tiếp cận 2 (Phương pháp phủ định cho các giá trị 1–n): Mark đã truy cập các chỉ mục bằng cách phủ định phần tử tại chỉ mục đó.

Cách tiếp cận 3 (Phát hiện chu kỳ của Floyd): Xử lý mảng như một danh sách được liên kết và tìm chu trình (cho các phần tử lặp lại trong phạm vi [1..n]).

Ví dụ:
Mảng [3,1,3,4,2] → Nhân đôi = 3.

Thời gian: TRÊN), Không gian: O(1).


18) Mảng thưa là gì và lợi ích của chúng?

A mảng thưa thớt chứa chủ yếu các giá trị bằng 0 hoặc mặc định. Thay vì lưu trữ tất cả các phần tử, chúng tôi chỉ lưu trữ các mục khác 0 cùng với chỉ số của chúng.

Ưu điểm:

  • Tiết kiệm bộ nhớ.
  • Hiệu quả đối với các tập dữ liệu lớn như ma trận hoặc tần suất thuật ngữ tài liệu.
Kiểu Ví dụ Trường hợp sử dụng
Mảng dày đặc [0,1,0,2,3] Dữ liệu nhỏ
Mảng thưa thớt {1:1, 3:2, 4:3} Dữ liệu thưa thớt lớn

Ví dụ: Được sử dụng trong các mô hình học máy (ma trận TF-IDF).


19) Làm thế nào để tìm giao điểm của hai mảng một cách hiệu quả?

Giao điểm có thể được tìm thấy bằng cách sử dụng kỹ thuật băm hoặc sắp xếp.

  • Sử dụng HashSet: Thêm các phần tử của mảng đầu tiên, sau đó kiểm tra quyền thành viên của mảng thứ hai.
  • Sử dụng hai con trỏ: Có tác dụng với các mảng đã được sắp xếp.

Ví dụ (Python):

intersection = list(set(arr1) & set(arr2))

Phức tạp:

  • HashSet: O(n)
  • Hai con trỏ: O(n log n) do sắp xếp.

20) Giải thích sự khác biệt giữa thứ tự hàng chính và thứ tự cột chính trong mảng.

Đây là các lệnh lưu trữ bộ nhớ được sử dụng cho mảng đa chiều.

GIỚI THIỆU Hàng trưởng (C/C++) Cột chính (Fortran, MATLAB)
Lệnh lưu trữ Hàng theo hàng Cột theo cột
Công thức địa chỉ Base + ((i * cols) + j) * size Base + ((j * rows) + i) * size
Lợi thế Nhanh hơn khi duyệt hàng Nhanh hơn khi duyệt cột

Ví dụ:
Đối với mảng 2 chiều A[2][3], các cửa hàng lớn [A[0][0], A[0][1], A[0][2], A[1][0], ...].


21) Kỹ thuật tổng tiền tố là gì và nó được sử dụng như thế nào trong mảng?

tiền tố tổng kỹ thuật này bao gồm việc tính toán trước tổng tích lũy của một mảng để trả lời các truy vấn phạm vi một cách hiệu quả.

Ý tưởng:

prefix[i] = prefix[i-1] + arr[i]

Sau đó, để lấy tổng các phần tử từ l đến r, hãy sử dụng:

sum(l, r) = prefix[r] - prefix[l-1]

Ví dụ:

Mảng = [2, 3, 5, 7, 1]

Tiền tố = [2, 5, 10, 17, 18]

Tổng(2,4) = prefix[4] - prefix[1] = 15

Ứng dụng
Được sử dụng trong các truy vấn tổng mảng con, bảng tần suất tích lũy và lập trình cạnh tranh.

Phức tạp:
Tiền xử lý: O(n), Truy vấn: O(1)


22) Kỹ thuật cửa sổ trượt cải thiện hiệu suất mảng như thế nào?

cửa sổ trượt Kỹ thuật này được sử dụng để giải quyết các vấn đề liên quan đến các phân đoạn liền kề (mảng con) một cách hiệu quả.

Ý tưởng: Thay vì tính toán lại tổng hoặc điều kiện cho mỗi cửa sổ, hãy cập nhật kết quả bằng cách thêm phần tử tiếp theo và xóa phần tử đầu tiên.

Vấn đề ví dụ:
Tìm mảng con có tổng lớn nhất có kích thước k.

Thuật toán:

  1. Tính tổng của đầu tiên k yếu tố.
  2. Trượt cửa sổ từng phần một.
  3. Thêm phần tử mới, xóa phần tử đầu tiên, và track là giá trị tối đa.

Độ phức tạp về thời gian: O(n) — nhanh hơn nhiều so với phương pháp O(n×k) đơn giản.

Ứng dụng
Được sử dụng trong các bài toán như mảng con trung bình lớn nhất, chuỗi con dài nhất hoặc số âm đầu tiên trong mỗi cửa sổ.


23) Sự khác biệt giữa mảng và con trỏ trong ngôn ngữ C là gì?

Tính năng Mảng Pointer
Định nghĩa Bộ sưu tập các yếu tố dữ liệu tương tự Biến lưu trữ địa chỉ bộ nhớ
Cấp phát bộ nhớ Tiếp giáp Động hoặc tùy ý
Kích thước máy đã sửa Có thể thay đổi kích thước
Ví dụ int a[5]; int *p;

Sự khác biệt chính:
Tên mảng hoạt động như một con trỏ hằng số, nhưng con trỏ có thể trỏ đến bất kỳ đâu một cách linh hoạt.

Ví dụ:

int arr[3] = {1,2,3};
int *ptr = arr;  // ptr points to first element

24) Làm thế nào để tìm được chỉ số cân bằng trong một mảng?

An chỉ số cân bằng là vị trí mà tổng các phần tử ở bên trái bằng tổng các phần tử ở bên phải.

Thuật toán:

  1. Tính tổng của mảng.
  2. Duyệt và duy trì tổng bên trái.
  3. If (total_sum - left_sum - arr[i]) == left_sum, trả về chỉ mục.

Ví dụ:
Mảng: [1, 3, 5, 2, 2] → Chỉ số = 2 (vì tổng trái = tổng phải = 4)

Phức tạp: TRÊN), Không gian: O (1)


25) Ma trận thưa là gì và chúng được lưu trữ hiệu quả như thế nào?

A ma trận thưa thớt chứa chủ yếu là số 0. Để tiết kiệm bộ nhớ, chỉ lưu trữ các phần tử khác không và chỉ số của chúng.

Phương pháp lưu trữ:

  1. Danh sách tọa độ (COO): Lưu trữ (hàng, cột, giá trị).
  2. Hàng thưa nén (CSR): Ba mảng: values, col_index, row_pointer.
  3. Từ điển khóa (DOK): Bản đồ băm của (hàng, cột) → giá trị.
Phương pháp Hiệu suất bộ nhớ Sử dụng ví dụ
COO Trung bình Kho chung
CSR Cao Tính toán số
D.O.K. Linh hoạt Chèn động

Được sử dụng rộng rãi trong học máy (TF-IDF, ma trận kề đồ thị).


26) Làm thế nào để sắp xếp lại một mảng sao cho các số chẵn và số lẻ xen kẽ nhau?

Mục tiêu là xen kẽ các số chẵn và số lẻ trong khi vẫn duy trì thứ tự tương đối của chúng.

Thuật toán:

  1. Phân tách các mảng chẵn và lẻ.
  2. Trộn lần lượt bắt đầu bằng số chẵn hoặc số lẻ.
  3. Nếu hết một loại, hãy thêm loại còn lại.

Ví dụ:

Input: [3, 6, 12, 1, 5, 8]
Output: [6, 3, 12, 1, 8, 5]

Phức tạp: O (n)


27) Giải thích sự khác biệt giữa phép quay mảng và phép dịch chuyển mảng.

Operasản xuất Rotation Shifting
Định nghĩa Các yếu tố chuyển động tròn Các phần tử di chuyển, các vị trí trống được điền đầy (ví dụ: 0)
Ví dụ [1,2,3,4] → [3,4,1,2] [1,2,3,4] → [0,1,2,3]
Dữ liệu bị mất Không Có
Sử dụng Sự sắp xếp lại tuần hoàn Triển khai hàng đợi

Tóm lại:
Sự quay có thể đảo ngược được nhưng sự dịch chuyển thường không thể đảo ngược được.


28) Làm thế nào để tìm được mảng con tích lớn nhất?

Tương tự như thuật toán Kadane, nhưng bạn... track có cả tích cực đại và cực tiểu do giá trị âm.

Thuật toán:

  1. khởi max_ending_here = min_ending_here = arr[0].
  2. Lặp lại và cập nhật dựa trên phần tử hiện tại.
  3. Track max_so_far.

Ví dụ:
Đầu vào: [2,3,-2,4] → Đầu ra: 6 (mảng con [2,3])

Phức tạp: TRÊN), Không gian: O (1)


29) Làm thế nào bạn có thể đếm hiệu quả số lượng mảng con với một tổng nhất định?

Cách tiếp cận (Tổng tiền tố + Bản đồ băm):

  1. Duy trì tổng đang chạy trong khi lặp lại.
  2. Đối với mỗi tổng tiền tố, hãy kiểm tra xem (current_sum - target) tồn tại trong bản đồ băm.
  3. Tăng số lượng theo đó.

Ví dụ:

arr = [10,2,-2,-20,10], target = -10
Output = 3 subarrays

Độ phức tạp về thời gian: O (n)

Không gian phức tạp: O (n)


30) Thao tác bit trong các bài toán mảng là gì và nó được áp dụng ở đâu?

Thao tác bit bao gồm việc thực hiện các phép toán như AND, OR, XOR và dịch chuyển để giải quyết vấn đề một cách hiệu quả.

Các ứng dụng phổ biến:

  • Tìm phần tử duy nhất không lặp lại bằng XOR.
  • Kiểm tra xem tập hợp con có tồn tại hay không bằng cách sử dụng bitmasking.
  • Biểu diễn các tập hợp dưới dạng vectơ bit.

Ví dụ:

Tìm phần tử xuất hiện một lần khi các phần tử khác xuất hiện hai lần:

int res = 0;
for (int num : arr) res ^= num;

Ưu điểm:

  • Không gian hằng số
  • Tính toán logic nhanh

31) Làm thế nào để duyệt ma trận theo thứ tự xoắn ốc?

A chuyển động xoắn ốc thăm tất cả các phần tử ma trận từng lớp theo chiều kim đồng hồ.

Thuật toán:

  1. Xác định bốn ranh giới: top, bottom, leftvà right.
  2. Di chuyển từ trái → phải, trên → dưới, phải → trái và dưới → trên.
  3. Thu hẹp ranh giới sau mỗi lần quét cho đến khi tất cả các phần tử được bao phủ.

Ví dụ:

Input:
1 2 3
4 5 6
7 8 9
Output: [1,2,3,6,9,8,7,4,5]

Phức tạp:
Thời gian: O(n×m) | Không gian: O(1)


32) Có những cách nào để sắp xếp một mảng? Giải thích bằng ví dụ.

Sắp xếp là sắp xếp lại các phần tử theo một thứ tự cụ thể. Việc lựa chọn thuật toán phụ thuộc vào kích thước dữ liệu, phân phối và hạn chế bộ nhớ.

Thuật toán Trường hợp tốt nhất Trường hợp trung bình Ổn định Không gian
Bubble Sắp xếp O (n) O (n²) Có O (1)
Hợp nhất Sắp xếp O (n log n) O (n log n) Có O (n)
Sắp xếp nhanh chóng O (n log n) O (n²) Không O (log n)
Sắp xếp đống O (n log n) O (n log n) Không O (1)

Ví dụ (Python Sắp xếp nhanh):

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr)//2]
    return quicksort([x for x in arr if x < pivot]) + [x for x in arr if x == pivot] + quicksort([x for x in arr if x > pivot])

33) Giải thích kỹ thuật hai con trỏ trong mảng.

kỹ thuật hai con trỏ sử dụng hai chỉ số để duyệt cấu trúc dữ liệu từ các đầu hoặc tốc độ khác nhau, tối ưu hóa thời gian và không gian.

Sử dụng chung:

  • Phát hiện các cặp có tổng cho trước trong các mảng đã sắp xếp.
  • Xóa các mục trùng lặp tại chỗ.
  • Revmảng ersing.
  • Khoảng thời gian hợp nhất.

Ví dụ (Ghép nối với Target Tổng):

arr = [1,2,3,4,6], target = 6
left, right = 0, len(arr)-1
while left < right:
    s = arr[left] + arr[right]
    if s == target: print(arr[left], arr[right])
    elif s < target: left += 1
    else: right -= 1

Phức tạp: O (n)


34) Làm thế nào để tìm ra phần tử chiếm đa số trong một mảng?

A phần tử đa số xuất hiện nhiều hơn ⌊n/2⌋ lần.

Thuật toán bỏ phiếu Boyer-Moore giải quyết vấn đề này trong thời gian tuyến tính và không gian hằng số.

Các bước của thuật toán:

  1. khởi candidate và count = 0.
  2. Đối với mỗi phần tử:
    • Nếu count = 0, thiết lập candidate = element.
    • Tăng/giảm số lượng dựa trên sự bằng nhau.
  3. Xác minh ứng viên.

Ví dụ: [3,2,3] → Đầu ra: 3

Phức tạp: O (n)


35) Sự khác biệt giữa tìm kiếm nhị phân và tìm kiếm hàm mũ là gì?

Tính năng Tìm kiếm nhị phân Tìm kiếm theo hàm mũ
Hạng mục Mảng đã sắp xếp Mảng đã sắp xếp
Ý chính Chia mảng thành hai nửa Tìm phạm vi theo cấp số nhân trước khi tìm kiếm nhị phân
phức tạp O (log n) O (log n)
Trường hợp sử dụng Kích thước đã biết Mảng không xác định hoặc vô hạn

Ví dụ:
Đối với các tập dữ liệu lớn hoặc mảng không giới hạn (như API phân trang), tìm kiếm theo cấp số nhân sẽ tìm phạm vi một cách hiệu quả.


36) Làm thế nào để tìm phần tử nhỏ nhất hoặc lớn nhất thứ k trong một mảng?

Phương pháp tiếp cận:

  1. Sắp xếp: Sắp xếp và truy cập k-1chỉ số thứ (O(n log n)).
  2. Đống tối thiểu/tối đa: Hiệu quả cho các truy vấn thường xuyên (O(n log k)).
  3. QuickSelect (Thuật toán Hoare): O(n) trung bình.

Ví dụ (Python sử dụng heapq):

import heapq
arr = [3,2,1,5,6,4]
k = 2
print(heapq.nlargest(k, arr)[-1])  # 5

Ca sử dụng: Bảng xếp hạng, số liệu hiệu suất cao nhất, phân tích phần trăm.


37) Làm thế nào để tìm số bị thiếu và số lặp lại trong một mảng từ 1 đến n?

Cho một mảng chứa các số từ 1 đến n, trong đó có một số bị thiếu và một số lặp lại:

Cách tiếp cận 1 (Toán học):
Sử dụng hiệu số giữa tổng thực tế và tổng dự kiến ​​và tổng bình phương.

Cách tiếp cận 2 (Phương pháp XOR):

  1. XOR tất cả các phần tử của mảng và 1…n.
  2. Kết quả đưa ra phép XOR của các số bị thiếu và số lặp lại.
  3. Chia bằng cách sử dụng bit set ngoài cùng bên phải.

Phức tạp: TRÊN), Không gian: O (1)

Ví dụ:

Input: [4,3,6,2,1,1]
Output: Missing = 5, Repeating = 1

38) Số đếm đảo ngược trong mảng là gì và cách tính chúng như thế nào?

An đảo ngược là một cặp (i, j) sao cho i < j và arr[i] > arr[j].

Tiếp cận:

  • Ngây thơ: Kiểm tra tất cả các cặp → O(n²).
  • Tối ưu hóa (Sắp xếp hợp nhất): Đếm số lần đảo ngược trong quá trình hợp nhất → O(n log n).

Ví dụ:

Input: [8, 4, 2, 1]
Inversions = 6 → (8,4), (8,2), (8,1), (4,2), (4,1), (2,1)

Được dùng trong đo lường sự rối loạn của mảng và hệ thống xếp hạng.


39) Làm thế nào để tìm được trung vị của hai mảng đã sắp xếp?

Phương pháp tối ưu (Tìm kiếm nhị phân):
Chia cả hai mảng sao cho nửa bên trái có số phần tử bằng nửa bên phải.

Thuật toán:

  1. Sử dụng tìm kiếm nhị phân trên mảng nhỏ hơn.
  2. So sánh ranh giới phân vùng.
  3. Trả về trung vị dựa trên giá trị phân vùng.

Phức tạp: O(log(phút(n, m)))

Ví dụ:

A = [1,3], B = [2]
Median = 2.0

40) Ưu điểm của việc sử dụng mảng so với danh sách liên kết là gì?

Hệ số Mảng Danh sách liên kết
Bộ nhớ Tiếp giáp Không liền kề
Thời gian truy cập O (1) O (n)
Chèn/Xóa Đắt tiền Có hiệu quả
Vị trí bộ nhớ đệm Xuất sắc Tệ
Trên không Không áp dụng Bộ nhớ con trỏ bổ sung

Kết luận:
Mảng là giải pháp tối ưu cho các tập dữ liệu có kích thước cố định yêu cầu truy cập ngẫu nhiên, trong khi danh sách liên kết tốt hơn cho việc chèn và xóa động.


41) Làm thế nào để tìm tổng lớn nhất của một mảng con hình tròn?

Trong một mảng tròn, các phần tử bao quanh ở phần cuối.

Tiếp cận:

  1. Tìm tổng mảng con lớn nhất bình thường bằng cách sử dụng Thuật toán của Kadane.
  2. Tìm tổng mảng con nhỏ nhất.
  3. Kết quả = max(normal_max, total_sum - min_subarray).

Trường hợp ngoại lệ: Nếu tất cả các phần tử đều âm, trả về phần tử lớn nhất.

Ví dụ:

Input: [5, -2, 3, 4]
Normal Max = 10, Circular Max = 12 → Output = 12

Phức tạp: O (n)


42) Làm thế nào để tìm kiếm một phần tử trong một mảng được sắp xếp theo kiểu xoay?

Sử dụng tìm kiếm nhị phân đã sửa đổi để tìm điểm xoay và điều chỉnh các so sánh.

Thuật toán:

  1. Tìm trung bình = (thấp + cao) / 2.
  2. Kiểm tra nếu arr[mid] == target.
  3. Nếu nửa bên trái được sắp xếp → tìm kiếm bên trái; nếu không, tìm kiếm bên phải.

Ví dụ:

Input: [4,5,6,7,0,1,2], target = 0
Output: Index = 4

Độ phức tạp về thời gian: O (log n)


43) Giải thích phương pháp lập trình động cho “Dãy con tăng tổng cực đại”.

Mục tiêu là tìm tổng lớn nhất của một dãy con tăng dần.

Thuật toán:

  1. khởi dp[i] = arr[i].
  2. Cho mỗi i, kiểm tra các yếu tố trước đó j < i:
    • If arr[j] < arr[i]thì dp[i] = max(dp[i], arr[i] + dp[j]).
  3. Trả về giá trị lớn nhất trong dp.

Ví dụ:

Input: [1, 101, 2, 3, 100, 4, 5]
Output: 106 (1 + 2 + 3 + 100)

Thời gian: O(n²) | Không gian: O (n)


44) “Cái bẫy” là gì?ping Vấn đề "Nước mưa" và cách giải quyết?

Bài toán mảng cổ điển này yêu cầu phải tính toán lượng nước có thể giữ lại giữa các thanh sau khi mưa.

Cách tiếp cận (Hai điểm):

  1. khởi left, right, left_max, right_max.
  2. Di chuyển con trỏ vào bên trong, cập nhật nước bị kẹt = min(left_max, right_max) - height[i].

Ví dụ:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
Phương pháp tiếp cận Thời gian Không gian
Brute Force O (n²) O (1)
Lập trình năng động O (n) O (n)
Hai con trỏ O (n) O (1)

45) Làm thế nào để tìm được mảng con dài nhất có tổng bằng 0?

Thuật toán (Bản đồ băm):

  1. Khởi tạo bản đồ băm để lưu trữ tổng tiền tố.
  2. Nếu cùng một tiền tố tổng xuất hiện lần nữa, mảng con giữa các chỉ số có tổng bằng không.

Ví dụ:

Input: [15, -2, 2, -8, 1, 7, 10, 23]
Output: Length = 5 (Subarray [-2, 2, -8, 1, 7])

Phức tạp: O (n)


46) Sự khác biệt giữa làm phẳng nông và làm phẳng sâu của mảng đa chiều là gì?

Kiểu Định nghĩa Ví dụ
Làm phẳng nông Chỉ làm phẳng một cấp độ [[1,2],[3,[4]]] → [1,2,3,[4]]
Làm phẳng sâu Làm phẳng hoàn toàn tất cả các mảng lồng nhau [[1,2],[3,[4]]] → [1,2,3,4]

Ví dụ (Python):

import itertools
shallow = list(itertools.chain.from_iterable(arr))

Ca sử dụng: Hữu ích trong việc dọn dẹp dữ liệu và chuẩn hóa dữ liệu phân cấp.


47) Làm thế nào để tìm phần tử cân bằng trong ma trận (mảng 2D)?

An yếu tố cân bằng trong một ma trận là một phần tử có tổng hàng và tổng cột được cân bằng.

Thuật toán:

  1. Tính trước tổng hàng và tổng cột.
  2. Đối với mỗi phần tử, hãy kiểm tra xem row_sum[i] - arr[i][j] == col_sum[j] - arr[i][j].

Ví dụ:

Ma trận:

Matrix:
2 7 5
3 1 1
4 6 8
Output: Element 1 at (1,1)

Phức tạp: O (n²)


48) Làm thế nào bạn có thể phân vùng một mảng thành hai tập hợp con có tổng bằng nhau?

Đây là một bài toán tổng-tập con, được giải quyết bằng cách sử dụng Lập trình năng động.

Tiếp cận:

  1. Tính tổng số tiền.
  2. Nếu lẻ → trả về False.
  3. Tạo bảng DP để kiểm tra xem tập hợp con có sum/2 tồn tại.

Ví dụ:

Input: [1,5,11,5]
Output: True (Subsets: [1,5,5] and [11])

Thời gian: O(n × tổng/2) | Không gian: O(tổng/2)


49) Làm thế nào để xoay ma trận 90 độ theo chiều kim đồng hồ?

Thuật toán:

  1. Chuyển vị ma trận.
  2. Reverse từng hàng.

Ví dụ:

Input:
1 2 3
4 5 6
7 8 9
Output:
7 4 1
8 5 2
9 6 3

Phức tạp: O(n²), Tại chỗ.

Được dùng trong đang xử lý hình ảnh và chuyển đổi trực quan hóa dữ liệu.


50) Ứng dụng thực tế phổ biến nhất của mảng là gì?

Mảng là nền tảng cho nhiều hệ thống tính toán và thực tế.

Ứng dụng

  • Lập chỉ mục cơ sở dữ liệu: Lưu trữ và sắp xếp hồ sơ.
  • Học máy: Các vectơ đặc trưng, ​​ma trận và tenxơ.
  • Đang xử lý hình ảnh: Dữ liệu pixel 2D và 3D.
  • Operahệ thống ting: Lập lịch bộ nhớ và quy trình.
  • Mạng lưới: Bộ đệm và định tuyến gói tin.
  • Trò chơi: Trạng thái người chơi tracvua và lưới.
miền Vai trò mảng
AI / ML Biểu diễn tenxơ và ma trận
DBMS Lập chỉ mục và tối ưu hóa tìm kiếm
Hệ thống nhúng Dữ liệu cảm biến thời gian thực
Cloud Computing Mảng phân phối tải

Mảng cung cấp xương sống cho việc tổ chức dữ liệu, tính toán và khả năng mở rộng hiệu quả.


🔍 Những câu hỏi phỏng vấn hàng đầu với các tình huống thực tế và câu trả lời chiến lược

1) Mảng là gì và nó khác với các cấu trúc dữ liệu khác như thế nào?

Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá hiểu biết cơ bản của bạn về mảng, bao gồm mục đích, cấu trúc và sự khác biệt của chúng so với các kiểu dữ liệu khác như danh sách liên kết hoặc bản đồ băm.

Câu trả lời ví dụ:
Mảng là một tập hợp các phần tử được lưu trữ trong các vị trí bộ nhớ liền kề, trong đó mỗi phần tử có thể được truy cập bằng một chỉ mục. Không giống như danh sách liên kết, mảng cung cấp khả năng truy cập theo thời gian không đổi (O(1)) đến các phần tử nhưng yêu cầu kích thước cố định được xác định tại thời điểm tạo. Điều này làm cho chúng hiệu quả cho các thao tác đọc nhưng kém linh hoạt hơn cho các thao tác chèn và xóa.


2) Làm thế nào để tìm phần tử lớn nhất và nhỏ nhất trong một mảng một cách hiệu quả?

Mong đợi từ ứng viên: Người phỏng vấn muốn kiểm tra tư duy thuật toán và khả năng tối ưu hóa hiệu suất của bạn.

Câu trả lời ví dụ:
“Để tìm cả phần tử lớn nhất và nhỏ nhất trong một mảng một cách hiệu quả, tôi sẽ lặp qua mảng một lần, giữ nguyên...ping track của giá trị lớn nhất và nhỏ nhất hiện tại. Phương pháp này có độ phức tạp thời gian là O(n) và độ phức tạp không gian là O(1), đây là mức tối ưu cho bài toán này.”


3) Mô tả cách bạn sẽ loại bỏ các phần tử trùng lặp khỏi một mảng chưa được sắp xếp.

Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá kiến ​​thức của bạn về thao tác mảng và cấu trúc dữ liệu có thể giúp bạn hoàn thành nhiệm vụ này.

Câu trả lời ví dụ:
“Tôi sẽ sử dụng một tập băm để lưu trữ các phần tử duy nhất trong khi lặp qua mảng. Nếu một phần tử đã có trong tập, tôi sẽ bỏ qua nó; nếu không, tôi sẽ thêm nó vào. Phương pháp này đảm bảo các phần tử trùng lặp được loại bỏ hiệu quả với độ phức tạp thời gian là O(n) và độ phức tạp không gian là O(n).”


4) Bạn có thể giải thích cách sắp xếp mảng hoạt động và nêu tên một số thuật toán phổ biến không?

Mong đợi từ ứng viên: Người phỏng vấn mong đợi sự quen thuộc với các thuật toán sắp xếp khác nhau và các trường hợp sử dụng của chúng.

Câu trả lời ví dụ:
“Sắp xếp mảng có thể đạt được bằng cách sử dụng nhiều thuật toán khác nhau như Sắp xếp nhanh, Sắp xếp trộn và Bubble Sort. Quick Sort hiệu quả đối với các trường hợp trung bình có độ phức tạp O(n log n), trong khi Merge Sort được ưu tiên cho các tập dữ liệu lớn vì tính ổn định của nó. Bubble Sort, mặc dù đơn giản, nhưng hiếm khi được sử dụng do hiệu suất O(n²) của nó.”


5) Hãy kể cho tôi nghe về một lần bạn tối ưu hóa một chương trình sử dụng nhiều mảng.

Mong đợi từ ứng viên: Người phỏng vấn muốn hiểu cách giải quyết vấn đề và khả năng cải thiện hiệu suất của bạn.

Câu trả lời ví dụ:
“Trong vai trò trước đây, tôi đã tối ưu hóa một tập lệnh xử lý dữ liệu dựa trên nhiều vòng lặp lồng nhau trên các mảng. Bằng cách triển khai kỹ thuật cắt mảng và sử dụng các phép toán vector hóa tích hợp, tôi đã giảm thời gian thực thi gần 60%, giúp cải thiện đáng kể khả năng phản hồi của hệ thống.”


6) Bạn sẽ xử lý lỗi chỉ mục mảng nằm ngoài giới hạn như thế nào?

Mong đợi từ ứng viên: Người phỏng vấn đang kiểm tra sự hiểu biết của bạn về cách xử lý lỗi và thực hành viết mã an toàn.

Câu trả lời ví dụ:
“Tôi sẽ đảm bảo tất cả các truy cập chỉ mục đều được xác thực trước khi sử dụng bằng cách kiểm tra xem chúng có nằm trong phạm vi độ dài của mảng hay không. Ngoài ra, tôi sẽ triển khai cơ chế try-catch hoặc các phương pháp xử lý lỗi tương đương để quản lý các lỗi ngoài giới hạn không mong muốn một cách khéo léo.”


7) Làm thế nào để đảo ngược một mảng mà không sử dụng thêm bộ nhớ?

Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá hiệu quả thuật toán và sự hiểu biết của bạn về các hoạt động tại chỗ.

Câu trả lời ví dụ:
“Tôi sẽ sử dụng hai con trỏ: một con trỏ bắt đầu từ đầu mảng và một con trỏ bắt đầu từ cuối mảng. Bằng cách hoán đổi.ping các phần tử ở những vị trí này và di chuyển cả hai con trỏ về phía trung tâm, mảng có thể được đảo ngược tại chỗ với độ phức tạp thời gian O(n) và độ phức tạp không gian O(1).


8) Hãy mô tả một tình huống bạn phải quản lý một mảng dữ liệu lớn. Bạn đã đảm bảo hiệu suất và độ chính xác như thế nào?

Mong đợi từ ứng viên: Người phỏng vấn muốn đánh giá khả năng xử lý dữ liệu thực tế và tối ưu hóa hiệu suất của bạn.

Câu trả lời ví dụ:
“Ở công việc trước đây, tôi làm việc với các mảng số lớn để phân tích dữ liệu tài chính. Để duy trì hiệu suất, tôi đã sử dụng các kỹ thuật quản lý bộ nhớ hiệu quả và xử lý hàng loạt. Tôi cũng tận dụng mảng NumPy để thực hiện các phép toán vectơ hóa, giúp cải thiện cả độ chính xác và tốc độ thực thi.”


9) Bạn sẽ thực hiện những bước nào để tìm kiếm một giá trị cụ thể trong một mảng đã sắp xếp?

Mong đợi từ ứng viên: Người phỏng vấn mong đợi bạn chứng minh được kiến ​​thức về thuật toán tìm kiếm.

Câu trả lời ví dụ:
“Đối với một mảng đã được sắp xếp, tôi sẽ sử dụng thuật toán tìm kiếm nhị phân, thuật toán này liên tục chia đôi khoảng tìm kiếm. Phương pháp này giảm độ phức tạp thời gian xuống còn O(log n), hiệu quả hơn nhiều so với tìm kiếm tuyến tính trên các tập dữ liệu lớn.”


10) Mảng đóng vai trò như thế nào trong việc giải quyết các vấn đề thực tế trong phát triển phần mềm?

Mong đợi từ ứng viên: Người phỏng vấn muốn hiểu cách bạn kết nối kiến ​​thức chuyên môn với các ứng dụng thực tế.

Câu trả lời ví dụ:
Mảng đóng vai trò nền tảng trong phát triển phần mềm vì chúng hỗ trợ lưu trữ và truy xuất dữ liệu hiệu quả. Ví dụ, trong vai trò trước đây của tôi, tôi đã sử dụng mảng để triển khai cơ chế lưu trữ đệm và sắp xếp dữ liệu cho bảng điều khiển phân tích. Điều này đã cải thiện khả năng truy cập dữ liệu và giảm thời gian phản hồi truy vấn.

Tóm tắt bài viết này với: