算法| ss 栈 单调栈

本文介绍了四个编程问题:利用单调栈解决行星碰撞问题、字符串解码中的双栈操作、移除字符串中特定位置的K位数字,以及计算每日温度的递减序列。
摘要由CSDN通过智能技术生成
  • 037.行星碰撞
  • 394.字符串解码
  • 402.移掉 K 位数字
  • 739.每日温度—1

037. 行星碰撞

/**
 * @param {number[]} asteroids
 * @return {number[]}
 */
// 思路
// 考虑负数情况:
// while循环 当前负数比栈顶大, 栈顶弹出
// 栈顶元素=向左的负数 栈顶弹出
// 其他情况存入栈中
var asteroidCollision = function (asteroids) {
  let stack = [];
  for (let ch of asteroids) {
    // 栈顶元素正数  栈顶元素小于 向左的负数 ,栈顶弹出
    while (
      stack.length &&
      stack[stack.length - 1] > 0 &&
      stack[stack.length - 1] < -ch
    ) {
      stack.pop();
    }
    // 栈顶元素=向左的负数
    if (stack.length && stack[stack.length - 1] === -ch) {
      stack.pop();
    } else if (ch > 0 || !stack.length || stack[stack.length - 1] < 0) {
      stack.push(ch);
    }
  }
  console.log(stack);
  return stack;
};

asteroidCollision([5, 10, -5]);

394.字符串解码

/** 394. 字符串解码
 * @param {string} s
 * @return {string}
 */
var decodeString = function (s) {
  const numStack = [];
  const strStack = [];
  let num = 0;
  let result = "";
  for (let char of s) {
    // 不能用typeof去判断
    if (!isNaN(char)) {
      num = num * 10 + Number(char);
    } else if (char === "[") {
      // 上一个字符串
      strStack.push(result);
      // 入栈后清空
      result = "";
      numStack.push(num);
      // 入栈后清0
      num = 0;
    } else if (char === "]") {
      let repeatNum = numStack.pop();
      // 存储的str+ 当前得到的
      result = strStack.pop() + result.repeat(repeatNum);
    } else {
      result += char;
    }
  }
  return result;
};

console.log(decodeString("3[a2[c]]"));
// 数字在前 双栈 字符串和数字
// 数字在后, 单栈,
// 区分数字/{/} 三种场景的操作

402. 移掉 K 位数字

/**
 * @param {string} num
 * @param {number} k
 * @return {string}
 */
// 思路 单调栈
// 边界:空数组返回0
// for循环数组
// while循环  栈顶大于当前值, 栈顶弹出 k--
// k 有剩余, 则栈顶继续pop
// 如果首位是0 ,首位移除shift
var removeKdigits = function (num, k) {
  const stack = [];
  if (num.length === k) return "0";
  for (let i = 0; i < num.length; i++) {
    while (stack.length && stack[stack.length - 1] > Number(num[i]) && k) {
      stack.pop();
      k--;
    }
    stack.push(Number(num[i]));
  }
  while (k) {
    stack.pop();
    k--;
  }
  while (stack.length > 1 && stack[0] === 0) {
    stack.shift();
  }
  console.log(stack);
  return stack.join("");
};
console.log(removeKdigits("1432219", 3));

739.每日温度—1

/**
 * @param {number[]} temperatures
 * @return {number[]}
 */
var dailyTemperatures = function (temperatures) {
  const stack = [];
  const len = temperatures.length;
  const arr = Array(len).fill(0);
  for (let i = 0; i < temperatures.length; i++) {
    const cur = temperatures[i];
    while (stack.length && cur > temperatures[stack[stack.length - 1]]) {
      const index = stack.pop();
      arr[index] = i - index;
    }
    stack.push(i);
  }
  console.log(arr);
};
dailyTemperatures([73, 74, 75, 71, 69, 72, 76, 73]);
// 输入: temperatures = [73,74,75,71,69,72,76,73]
// 输出: [1,1,4,2,1,1,0,0]

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值