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'
};

本文完,感谢阅读 🌹

相关推荐
code_YuJun4 分钟前
管理系统——应用初始化 Loading 动画
前端
oak隔壁找我5 分钟前
JavaScript 模块化演进历程:问题与解决方案。
前端·javascript·架构
Elieal19 分钟前
AJAX 知识
前端·ajax·okhttp
努力学习的小廉27 分钟前
我爱学算法之—— 分治-归并
c++·算法·1024程序员节
Gorgous—l37 分钟前
数据结构算法学习:LeetCode热题100-链表篇(下)(随机链表的复制、排序链表、合并 K 个升序链表、LRU 缓存)
数据结构·学习·算法
仰泳的熊猫37 分钟前
LeetCode:200. 岛屿数量
数据结构·c++·算法·leetcode
流星52112238 分钟前
GC 如何判断对象该回收?从可达性分析到回收时机的关键逻辑
java·jvm·笔记·学习·算法
sulikey38 分钟前
Qt 入门简洁笔记:从框架概念到开发环境搭建
开发语言·前端·c++·qt·前端框架·visual studio·qt框架
defaulter43 分钟前
Codeforces Round 1049 (Div. 2)C. Ultimate Value
算法·codeforces
让我们一起加油好吗1 小时前
【数论】费马小定理
c++·算法·数论·1024程序员节·费马小定理·逆元