Cho mảng chứa số 0 và các số khác. Di chuyển tất cả 0 về cuối mảng, giữ thứ tự các phần tử khác không đổi.
Ví dụ
Input: [4, 5, 0, 3, 2, 0, 0, 0, 5, 0, 1]
Output: [4, 5, 3, 2, 5, 1, 0, 0, 0, 0, 0]
Thuật toán (Two-pointer, O(N))
- Con trỏ
idx = 0vị trí đặt phần tử khác 0 tiếp theo. - Duyệt mảng: nếu
arr[i] != 0→arr[idx++] = arr[i]. - Sau vòng lặp, điền 0 vào các vị trí từ
idxđến hết.
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
void moveZerosToEnd(int arr[], int n) {
int idx = 0;
for (int i = 0; i < n; i++)
if (arr[i] != 0) arr[idx++] = arr[i];
while (idx < n) arr[idx++] = 0;
}
int main() {
int arr[] = {4,5,0,3,2,0,0,0,5,0,1};
int n = 11;
moveZerosToEnd(arr, n);
for (int x : arr) cout << x << ' ';
return 0;
}
Kết quả
4 5 3 2 5 1 0 0 0 0 0