Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Sắp xếp mảng theo tần suất tăng dần của phần tử trong JavaScript

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.

Mảng có thể chứa nhiều giá trị lặp lại. Hàm của chúng ta nên sắp xếp mảng sao cho các giá trị duy nhất hoặc có tần suất ít nhất được đặt trước các giá trị có tần suất nhiều nhất.

Ví dụ:

Nếu mảng đầu vào là:

const arr = [4, 7, 3, 5, 5, 4, 7, 9, 2, 1, 5, 7, 5, 5, 9];

Thì mảng đầu ra nên là:

const output = [    3, 2, 1, 9, 9, 4,    4, 7, 7, 7, 5, 5,    5, 5, 5 ];

Ví dụ

Dưới đây là mã nguồn:

const arr = [4, 7, 3, 5, 5, 4, 7, 9, 2, 1, 5, 7, 5, 5, 9]; const sortByNumbers = (arr = []) => {    const map = {};    const res = [];    for (let i = 0; i < arr.length; i++) {       map[arr[i]] = map[arr[i]] || [0];       map[arr[i]][0]++;       map[arr[i]][1] = arr[i];    }    const sorted = Object.values(map).sort((a, b) => {       if (a[0] === b[0]) {          return b[1] - a[1];       }       return a[0] - b[0]    });    for (let i = 0; i < sorted.length; i++) {       const [freq, num] = sorted[i]       for (let j = 0; j < freq; j++) {          res.push(num);       }    }    return res; }; console.log(sortByNumbers(arr));

Kết quả

Đầu ra trên console:

[    3, 2, 1, 9, 9, 4,    4, 7, 7, 7, 5, 5,    5, 5, 5 ]

Giải thích: Đếm tần suất, sort theo freq tăng, tie-break: giá trị lớn hơn trước (desc). Sau đó expand theo freq. LeetCode 1636 "Sort Array by Increasing Frequency" (tie-break: giá trị giảm).