JavaScript 中循环数组中的下一个更大元素

javascriptweb developmentfront end technology

循环数组

如果数组中最后一个元素的下一个元素是数组的第一个元素,则通常称为循环数组。

显然,不存在这样的机制来存储数据,数据仍将存储在连续的内存块中,循环数组更像是一种想法而非现实。

问题

我们需要编写一个 JavaScript 函数,该函数将一个循环整数数组 arr 作为第一个也是唯一的参数。

然后,该函数应构造并返回一个数组,该数组包含原始数组中每个对应元素的下一个更大元素。数字的下一个更大数字(例如 num)是数组中按其遍历顺序(在我们的例子中是右)排列的第一个更大数字,这意味着我们可以循环搜索以找到它的下一个更大数字。如果不存在,我们应该考虑将这个数字设为 -1。

例如,如果函数的输入是 −

const arr = [7, 8, 7];

那么输出应该是 −

const output = [8, -1, 8];

输出说明

数组中两个 7 的下一个更大元素是 8,由于数组是循环的,但对于 8,没有更大的元素,因此我们将其设为 -1。

示例

其代码为 −

const arr = [7, 8, 7];
const nextGreaterElement = (arr = []) => {
   const res = [];
   const stack = [];
   if (!arr || arr.length < 1){
      return res;
   };
   for (let i = 0; i < arr.length; i++) {
      while (stack.length > 0 && arr[stack[stack.length - 1]] < arr[i]) {
         const small = stack.pop();
         res[small] = arr[i];
      };
      stack.push(i);
   }
   for (let i = 0; i < arr.length; i++) {
      while (stack.length > 0 && arr[stack[stack.length - 1]] < arr[i]) {
         const small = stack.pop();
         res[small] = arr[i];
      };
   }
   const rem = stack.length;
   for (let i = 0; i < rem; i++) {
      res[stack.pop()] = -1;
      }
      return res;
   };
console.log(nextGreaterElement(arr));

代码说明:

在迭代数组时,如果我们在堆栈中找到一个大于 1 的元素,我们将 res[small] 设置为当前找到的较大元素。

现在,我们再次从 arr 的开头开始,处理在前一个 for 循环中找不到下一个更大元素的元素。最后,仍然会有一些元素没有下一个更大的元素。

输出

控制台中的输出将是 −

[8, -1, 8]

相关文章