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


循环数组

循环数组通常指数组中最后一个元素的下一个元素是数组的第一个元素。

显然,没有这样的机制来存储这样的数据,数据仍然会存储在连续的内存块中,循环数组更像是一个概念而不是现实。

问题

我们需要编写一个 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));

代码解释

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

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

输出

控制台中的输出将为 -

[8, -1, 8]

更新于: 2021年3月3日

229 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告