Chúng ta cần viết một hàm JavaScript nhận vào một mảng các giá trị chữ nghĩa làm đối số đầu tiên và duy nhất.
Hàm nên xây dựng và trả về một mảng tất cả các mảng con có thể được hình thành từ mảng gốc.
Ví dụ:
Nếu mảng đầu vào là:
const arr = [1, 2, 3];
Thì đầu ra nên là:
const output = [ [2], [1], [3], [1,2,3], [2,3], [1,2], [1, 3], [] ];
Thứ tự các mảng con không quan trọng lắm.
Ví dụ
Dưới đây là mã nguồn:
const arr = [1, 2, 3]; const findAllSubsets = (arr = []) => { arr.sort(); const res = [[]]; let count, subRes, preLength; for (let i = 0; i < arr.length; i++) { count = 1; while (arr[i + 1] && arr[i + 1] == arr[i]) { count += 1; i++; } preLength = res.length; for (let j = 0; j < preLength; j++) { subRes = res[j].slice(); for (let x = 1; x <= count; x++) { if (x > 0) subRes.push(arr[i]); res.push(subRes.slice()); } } }; return res; }; console.log(findAllSubsets(arr));Kết quả
Đầu ra trên console:
[ [], [ 1 ], [ 2 ], [ 1, 2 ], [ 3 ], [ 1, 3 ], [ 2, 3 ], [ 1, 2, 3 ] ]
Giải thích: Tạo power set (tất cả subsets). Code xử lý duplicate: đếm count của phần tử trùng, với mỗi subset hiện có, thêm 1..count bản sao của phần tử đó. Kết quả không chứa subset trùng lặp. Iterative approach.