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]