题意:
根据每日气温列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
类似的实现方法其实网上都有,但是我发现主要是Java实现的,所以写了个js版本自己留存,侵删。
1.双层循环
这个问题可以用双层循环来实现,这是最简单粗暴的方式:
- 外层循环数组,内层从i+1开始,也就是从i往后循环。
// 双层循环
function twoLoop(arr){
const res = [];
for(let i = 0;i<arr.length;i++){
let flag = false; // 在该数组中,是否能找到比它大的数值
for(let j = i+1; j<arr.length-1;j++){
if(arr[j] > arr[i]){
res[i] = j-i;
flag = true;
break;
}
}
if(!flag){
res[i] = 0;
}
}
return res;
}
// 测试一下
a1= [73, 74, 75, 71, 69, 72, 76, 73];
console.log(twoLoop(a1)); // 输出 [1, 1, 4, 2, 1, 1, 0, 0]
2.栈:
或者使用栈的思想:
- 设定一个单调递减的栈,里面存下标index,当新的数值比栈顶元素index指向的元素大的时候,就把栈顶元素index出栈,并获取下标的差。
- 外层循环数组,内层是拿最新元素和栈里面的元素比较,循环栈。
- 保证栈里面index指向的元素只会递减。
// 栈
function stackTest(arr) {
const result = new Array(arr.length);
const stack = [];
// 循环外层数组
for (let currIndex = 0; currIndex < arr.length; currIndex++) {
// 循环,if 当前下标指向的数组里的值 > 栈顶下标指向的数组里的值
while (stack.length > 0 && arr[currIndex] > arr[stack[stack.length - 1]]) {
// 就把栈顶index出栈
const preIndex = stack.pop();
// 结果数组里面出栈的那个index对应的值 = 当前下标-栈顶下标
result[preIndex] = currIndex - preIndex;
}
stack.push(currIndex);
}
// 把新下标再入栈
return result;
// 如果到最后一个元素了,就把栈里面的index全出栈,并把result数组中对应的值设为0
if(currIndex === n-1){
while(stack1.length > 0){
let existIndex = stack1.pop();
resultArr[existIndex] = 0;
}
}
}
// 测试
a1= [73, 74, 75, 71, 69, 72, 76, 73];
console.log(stackCase(a1)); // 输出[1, 1, 4, 2, 1, 1, 0, 0]