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ố thứ nhất và một số num làm đối số thứ hai. Các số trong mảng nằm trong khoảng [1, 13], đại diện cho chỉ số 1-based của bài chơi.
Hàm phải xác định xem có cách sắp xếp lại các bài thành các nhóm sao cho mỗi nhóm có kích thước num, và gồm num bài liên tiếp hay không.
Ví dụ, nếu đầu vào là:
Đầu vào
const arr = [1, 4, 3, 2]; const num = 2;
Đầu ra
const output = true;
Giải thích
Vì các bài có thể sắp xếp thành [1, 2], [3, 4].
Ví dụ
Dưới đây là mã thực hiện:
const arr = [1, 4, 3, 2];
const num = 2;
const canRearrange = (arr = [], num = 1) => {
const find = (map, n, num) => {
let j = 0;
while (j < num) {
if (!map[n + j]) return false;
else map[n + j] -= 1;
j++;
}
return true;
};
let map = {};
arr.sort(function(a, b) { return a - b; });
for (let n of arr) {
map[n] = map[n] ? map[n] + 1 : 1;
}
for (let n of arr) {
if (map[n] === 0 || find(map, n, num)) continue;
else return false;
}
return true;
};
console.log(canRearrange(arr, num));
Kết quả
true