Vấn đề
Chúng ta cần viết một hàm JavaScript nhận vào một mảng số arr làm đối số duy nhất.
Mảng arr có thể chứa các bản sao. Hàm phải sắp xếp mảng sao cho các phần tử xuất hiện ít lần nhất được đặt trước, theo sau là các phần tử theo tần suất tăng dần.
Nếu hai phần tử xuất hiện cùng số lần, chúng phải được đặt theo thứ tự tăng dần.
Ví dụ, nếu đầu vào của hàm là:
Đầu vào
const arr = [5, 4, 5, 4, 2, 1, 12];
Đầu ra
const output = [1, 2, 12, 4, 4, 5, 5];
Giải thích đầu ra
Các số 1, 2 và 12 đều xuất hiện một lần, do đó được sắp xếp theo thứ tự tăng dần, sau đó là 4 và 5 đều xuất hiện hai lần.
Ví dụ
Dưới đây là mã:
const arr = [5, 4, 5, 4, 2, 1, 12]; const sortByAppearance = (arr = []) => { arr.sort((a, b) => a - b); const res = []; const searched = {}; const countAppearance = (list, target) => { searched[target] = true; let count = 0; let index = list.indexOf(target); while(index !== -1){ count++; list.splice(index, 1); index = list.indexOf(target); }; return count; }; const map = []; arr.forEach(el => { if(!searched.hasOwnProperty(el)){ map.push([el, countAppearance(arr.slice(), el)]); }; }); map.sort((a, b) => a[1] - b[1]); map.forEach(([num, freq]) => { while(freq){ res.push(num); freq--; } }); return res; }; console.log(sortByAppearance(arr));Đầu ra
[1, 2, 12, 4, 4, 5, 5]