javascript面试算法题:明日温度-考察栈

javascript面试题:明日温度问题-考察栈

题意:

根据每日气温列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值