30 天刷题挑战(十)

题目来源: LeetCode 75 30 天 JavaScript 挑战

2637. 有时间限制的 Promise 对象

思路

fn 和定时器比较执行时间,如果超出限制时间 treject

代码

ts 复制代码
type Fn = (...params: any[]) => Promise<any>;

function timeLimit(fn: Fn, t: number): Fn {
  return async function(...args) {
    return new Promise((resolve, reject) => {
      fn(...args).then(resolve, reject)
      setTimeout(() => reject("Time Limit Exceeded"), t)
    })
  }
};

2622. 有时间限制的缓存

思路

Map 对象存储数据,给每一项添加时间限制,超时的项目直接删除

代码

ts 复制代码
interface Record {
  time: number,
  data: number
}

class TimeLimitedCache {
    store: Map<number, Record>
    
    constructor() {
      this.store = new Map()
    }
    
    set(key: number, value: number, duration: number): boolean {
      const now = Date.now()
      
      if (this.store.has(key)) {
        const val = this.store.get(key)
        val.time = now + duration
        val.data = value
        this.store.set(key, val) 

        return true
      }

      this.store.set(key, {
        data: value,
        time: now + duration
      })
       
      return false
    }

    get(key: number): number {
      if (!this.store.has(key)) {
        return -1
      }

      const val = this.store.get(key)
      const now = Date.now()
      const time = val.time

      if (now > time) {
        return -1
      }
        
      return val.data
    }

    count(): number {
      const now = Date.now()
      let res = 0

      for (let item of this.store) {
        const [key, val] = item

        if (now > val.time) {
          this.store.delete(key)
        } else {
          res++
        }

      }   
      return res
    }
}

933. 最近的请求次数

思路

每次调用 ping 就向 list 添加这次请求,然后返回数组中小于 t - 3000 的请求数

代码

ts 复制代码
class RecentCounter {
    list: Array<number>

    constructor() {
      this.list = []
    }

    ping(t: number): number {
      this.list.push(t)
      
      while(this.list[0] < t - 3000) {
        this.list.shift()
      }

      return this.list.length
    }
}

649. Dota2 参议院

思路

使用一个队列和一个栈,每次从队列开头拿出一项跟栈最后一项比较,相同就推进栈,不同就把栈顶推出,添加到队列尾

代码

ts 复制代码
function predictPartyVictory(senate: string): string {
  const stack = []
  const queue = senate.split("")

  while(queue.length) {
    const c = queue.shift()

    if (stack.length === 0 || stack[stack.length - 1] === c) {
      stack.push(c)
    } else {
      queue.push(stack.pop())
    }
  }

  return stack.pop() === 'R' ? 'Radiant' : 'Dire'
};

本文完,感谢阅读 🌹

相关推荐
书源5 分钟前
灵活性和可维护性,被严重低估的编程原则
前端·javascript·vue.js
努力学习的小廉8 分钟前
深入了解linux系统—— 线程同步
linux·服务器·数据库·算法
数据爬坡ing10 分钟前
从挑西瓜到树回归:用生活智慧理解机器学习算法
数据结构·深度学习·算法·决策树·机器学习
前端啵啵猪11 分钟前
useCallback 和 useMemo,什么时候用才是有效的?
前端·react.js
luoganttcc11 分钟前
小鹏汽车 vla 算法最新进展和模型结构细节
人工智能·算法·汽车
星哥说事22 分钟前
跨平台开源笔记神器,用DeepSeek写笔记 , 效率翻倍
前端
喜欢你,还有大家1 小时前
FTP文件传输服务
linux·运维·服务器·前端
该用户已不存在1 小时前
你没有听说过的7个Windows开发必备工具
前端·windows·后端
Bi1 小时前
Dokploy安装和部署项目流程
运维·前端