题目来源: LeetCode 75 30 天 JavaScript 挑战
2621. 睡眠函数
思路
考察 Promise
使用
代码
ts
/**
* @param {number} millis
* @return {Promise}
*/
async function sleep(millis) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(millis)
}, millis)
})
}
2715. 执行可取消的延迟函数
思路
考察 setTimeout
使用
代码
ts
function cancellable(fn: Fn, args: JSONValue[], t: number): Function {
const timeout = setTimeout(() => {
fn(...args)
}, t)
return () => clearTimeout(timeout)
};
2725. 间隔取消
思路
考察 setInterval
使用
代码
ts
function cancellable(fn: Fn, args: JSONValue[], t: number): Function {
fn(...args)
const interval = setInterval(() => fn(...args), t)
return () => clearInterval(interval)
};
2390. 从字符串中移除星号
思路
使用一个栈,遇到 *
就 pop
,否则就 push
代码
ts
function removeStars(s: string): string {
const res = []
for (let i = 0; i < s.length; i++) {
if (s[i] === "*") {
res.pop()
} else {
res.push(s[i])
}
}
return res.join('')
};
735. 小行星碰撞
思路
使用一个 "栈" 模拟碰撞,遍历原数组,按题意比较 "栈" 的最后一位和数组当前值
代码
ts
function asteroidCollision(asteroids: number[]): number[] {
const stack = []
for(const t of asteroids) {
let ok = true
while(ok && stack.length > 0 && stack[stack.length - 1] > 0 && t < 0) {
const a = stack[stack.length - 1]
const b = -t
// 如果栈的最后一位小于或等于数组当前值就 pop
if (a <= b) {
stack.pop()
}
// 如果栈的最后一位大于或等于数组当前值就不添加
if (a >= b) {
ok = false
}
}
if (ok) {
stack.push(t)
}
}
return stack
};
394. 字符串解码
思路
代码
js
const decodeString = (s) => {
let numStack = []; // 存倍数的栈
let strStack = []; // 存 待拼接的str 的栈
let num = 0; // 倍数的"搬运工"
let result = ''; // 字符串的"搬运工"
for (const char of s) { // 逐字符扫描
if (!isNaN(char)) { // 遇到数字
num = num * 10 + parseInt(char); // 算出倍数
} else if (char == '[') { // 遇到 [
strStack.push(result); // result串入栈
result = ''; // 入栈后清零
numStack.push(num); // 倍数num进入栈等待
num = 0; // 入栈后清零
} else if (char == ']') { // 遇到 ],两个栈的栈顶出栈
let repeatTimes = numStack.pop(); // 获取拷贝次数
result = strStack.pop() + result.repeat(repeatTimes); // 构建子串
} else {
result += char; // 遇到字母,追加给result串
}
}
return result;
};
本文完,感谢阅读 🌹