30 天刷题计划(九)

题目来源: 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;
};

本文完,感谢阅读 🌹

相关推荐
chengpei1471 分钟前
chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确
java·前端·chrome·spring boot·json
天乐敲代码10 分钟前
JAVASE入门九脚-集合框架ArrayList,LinkedList,HashSet,TreeSet,迭代
java·开发语言·算法
我命由我1234510 分钟前
NPM 与 Node.js 版本兼容问题:npm warn cli npm does not support Node.js
前端·javascript·前端框架·npm·node.js·html5·js
十年一梦实验室14 分钟前
【Eigen教程】矩阵、数组和向量类(二)
线性代数·算法·矩阵
Kent_J_Truman16 分钟前
【子矩阵——优先队列】
算法
每一天,每一步19 分钟前
react antd点击table单元格文字下载指定的excel路径
前端·react.js·excel
浪浪山小白兔20 分钟前
HTML5 语义元素详解
前端·html·html5
小魔女千千鱼42 分钟前
【真机调试】前端开发:移动端特殊手机型号有问题,如何在电脑上进行调试?
前端·智能手机·真机调试
16年上任的CTO42 分钟前
一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk
前端·webpack·node.js·chunksid·runtimechunk
Orange30151142 分钟前
【自己动手开发Webpack插件:开启前端构建工具的个性化定制之旅】
前端·javascript·webpack·typescript·node.js