Mô tả bài toán
Viết hàm sắp xếp lại mảng sao cho các số có 3 chữ số (100-999) xuất hiện trước, giữ nguyên thứ tự tương đối của các nhóm.
Ví dụ minh họa
const numList = [1, 324, 34, 3434, 304, 2929, 23, 444];
const isThreeDigit = num => num > 99 && num < 1000;
const bringToFront = arr => {
for (let i = 0; i < arr.length; i++) {
if (!isThreeDigit(arr[i])) continue;
arr.unshift(arr.splice(i, 1)[0]);
}
};
bringToFront(numList);
console.log(numList);
Kết quả
[ 444, 304, 324, 1, 34, 3434, 2929, 23 ]
Phân tích
Thuật toán duyệt mảng, khi gặp số 3 chữ số, cắt nó ra (splice) và chèn vào đầu (unshift). Do duyệt từ trái sang phải, thứ tự các số 3 chữ số bị đảo ngược so với mảng gốc.
Cách tốt hơn
Dùng filter() tách hai nhóm rồi nối:
const bringToFront = arr => [ ...arr.filter(isThreeDigit), ...arr.filter(n => !isThreeDigit(n)) ];