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. Hàm phải xây dựng một mảng mới cho đầu vào, trong đó mỗi phần tử tương ứng là khoảng cách đến phần tử lớn hơn tiếp theo so với phần tử hiện tại. Nếu không có phần tử lớn hơn bên phải, đẩy 0 cho phần tử đó trong mảng kết quả.
Ví dụ, nếu đầu vào là:
Đầu vào
const arr = [12, 13, 14, 11, 16, 10, 12, 17, 19, 18];
Đầu ra
const output = [1, 1, 2, 1, 3, 1, 1, 1, 0, 0];
Giải thích
Phần tử lớn hơn tiếp theo của 12 là 13, cách 1 vị trí; của 13 là 14, cách 1; của 14 là 16, cách 2; và cứ thế.
Ví dụ
Dưới đây là mã thực hiện:
const arr = [12, 13, 14, 11, 16, 10, 12, 17, 19, 18];
const findNextGreater = (arr = []) => {
const stack = [];
const res = new Array(arr.length).fill(0);
for (let i = 0; i < arr.length; i++) {
while (arr[i] > arr[stack[stack.length - 1]] && stack.length > 0) {
const index = stack.pop();
res[index] = i - index;
}
stack.push(i);
}
return res;
};
console.log(findNextGreater(arr));
Kết quả
[1, 1, 2, 1, 3, 1, 1, 1, 0, 0]