Mô tả vấn đề
Chúng ta cần viết một hàm JavaScript nhận vào một chuỗi ký tự str làm đối số đầu tiên và một số num (num << độ dài chuỗi str) làm đối số thứ hai.
Hàm phải sắp xếp lại các ký tự của chuỗi str và xây dựng một chuỗi mới sao cho không có hai ký tự giống nhau nào cách nhau dưới num ký tự. Nói cách khác, các ký tự giống nhau phải cách nhau ít nhất num ký tự.
Hàm sau đó trả về chuỗi mới được xây dựng. Nếu không thể đạt được sắp xếp này, hàm sẽ trả về chuỗi rỗng.
Ví dụ, nếu đầu vào của hàm là:
const str = 'kkllmm';
Thì đầu ra nên là:
const output = 'mlmklk';
Ví dụ minh họa
Mã thực hiện như sau:
const str = 'kkllmm';
const placeApart = (str = '') => {
const map = {};
for(let i = 0; i < str.length; i++){
map[str[i]] = map[str[i]] || 0;
map[str[i]]++;
}
let keys = Object.keys(map).sort((a, b) => {
if(map[a] < map[b]) return 1;
return -1;
});
let len = str.length % 2 ? (Math.floor(str.length / 2) + 1) : str.length / 2;
if(map[keys[0]] > len){
return "";
};
const res = [];
let index = 0, max = str.length - 1;
while(keys.length){
let currKey = keys.shift();
let count = map[currKey];
while(count){
res[index] = currKey;
index = index + 2;
if(index > max) index = 1;
count--;
}
}
return res.join("");
};
console.log(placeApart(str));Đầu ra
Kết quả trong console sẽ là:
mlmklk