Mô tả vấn đề
Hàm JavaScript nhận vào mảng arr chứa các giá trị lặp lại liền kề. Hàm sắp xếp lại các phần tử sao cho không có hai phần tử nào bằng nhau. Trả về mảng đã sắp xếp lại (đảm bảo luôn có ít nhất một cách sắp xếp).
Ví dụ, nếu đầu vào là:
const arr = [7, 7, 7, 8, 8, 8];
Thì đầu ra nên là:
const output = [7, 8, 7, 8, 7, 8];
Giải thích đầu ra
Có thể có các sắp xếp đúng khác.
Ví dụ minh họa
Mã thực hiện (tham lam: đặt phần tử xuất hiện nhiều nhất vào vị trí chẵn trước):
const arr = [7, 7, 7, 8, 8, 8];
const rearrangeArray = (arr = []) => {
const map = arr.reduce((acc, val) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
const keys = Object.keys(map).sort((a, b) => map[a] - map[b]);
const res = [];
let key = keys.pop();
for(let i = 0; i < arr.length; i += 2){
if(map[key] <= 0){
key = keys.pop();
};
map[key] -= 1;
res[i] = Number(key);
};
for(let i = 1; i < arr.length; i += 2){
if(map[key] <= 0){
key = keys.pop();
};
map[key] -= 1;
res[i] = Number(key);
};
return res;
};
console.log(rearrangeArray(arr));Đầu ra
Kết quả trong console sẽ là:
[ 8, 7, 8, 7, 8, 7 ]