手写算法: 字符串解码
思路
用栈的思想来解决此题,由内到外。
分别用两个栈来存储数字
numStack,和待拼接的字符串strStack,temp 和 num 用来存储临时倍数和临时字符串入栈时机:遇到
[,意味着要先解决内部的,外部的倍数和字符串都先不用考虑,在栈中等待
- 当遇到
[,前面扫描过的数字就是倍数,入栈等待;前面扫描过的字符串也同样入栈等待,等[]里的解码完后,就能一起构建
- 出栈时机:遇到
]说明内层已经扫描完了,需要将之前的字符串都拼接起来,再进行出栈,此时就是外层的倍数和字符串
/**
* @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()
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;
}
}