手写算法: 字符串解码

394. 字符串解码open in new window

思路

用栈的思想来解决此题,由内到外。

  1. 分别用两个栈来存储数字numStack,和待拼接的字符串strStack,temp 和 num 用来存储临时倍数和临时字符串

  2. 入栈时机:遇到[,意味着要先解决内部的,外部的倍数和字符串都先不用考虑,在栈中等待

  • 当遇到[,前面扫描过的数字就是倍数,入栈等待;前面扫描过的字符串也同样入栈等待,等[]里的解码完后,就能一起构建
  1. 出栈时机:遇到]说明内层已经扫描完了,需要将之前的字符串都拼接起来,再进行出栈,此时就是外层的倍数和字符串
/**
 * @param {string} s
 * @return {string}
 */
var decodeString = function(s) {
  let numStack = [];
  let strStack = [];
  let temp = '';
  let num = 0;

  for (let i = 0; i < s.length; i++) {
    const cur = s[i];
    if (/\d/.test(cur)) {
      num = num * 10 + +cur;
    } else if (cur === '[') {
      numStack.push(num);
      strStack.push(temp);
      num = 0;
      temp = '';
    } else if (cur === ']') {
      const repeatTimes = numStack.pop();
      temp = strStack.pop() + temp.repeat(repeatTimes);
    } else {
      temp += cur;
    }
  }
  return temp;
};

手写题: 实现 Object.is()

116. 实现 Object.is()open in new window

Object.is()为了解决 +0 === -0, NaN !== NaN 的问题

Object.is(+0, -0),认为+0 与-0 不是同一个数

Object.is(NaN, NaN)认为它俩为同一个数

/**
 * @param {any} a
 * @param {any} b
 * @return {boolean}
 */
function is(a, b) {
  // +0 === -0
  if (a === b) {
    return 1 / a === 1 / b || a !== 0;
  } else {
    return a !== a && b !== b;
  }
}
Last Updated:
Contributors: kk