Mô tả bài toán
Cho mảng số, gộp các giá trị trùng nhau bằng cách cộng dồn vào lần xuất hiện đầu tiên, loại bỏ các bản sao.
Ví dụ minh họa
const arr = [20, 10, 15, 20, 15, 10];
const addSimilar = arr => {
for (let i = 0; i < arr.length; i++) {
while (i !== arr.lastIndexOf(arr[i])) {
const ind = arr.lastIndexOf(arr[i]);
arr[i] += arr.splice(ind, 1)[0];
}
}
};
addSimilar(arr);
console.log(arr);
Kết quả
[ 40, 20, 30 ]
Phân tích
Thuật toán sửa đổi mảng gốc (in-place). Duyệt từ đầu, tìm lần xuất hiện cuối cùng của giá trị hiện tại, cộng vào vị trí đầu tiên và xóa bản sao cuối.
Cách viết hàm thuần túy (immutable)
const addSimilar = arr =>
Object.values(arr.reduce((acc, v) => (acc[v] = (acc[v] || 0) + v, acc), {}));
Ưu điểm cách mới
Không thay đổi mảng gốc, dễ test, tận dụng object như hash map O(n).