30 天刷题挑战(十)

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

2637. 有时间限制的 Promise 对象

思路

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

代码

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

本文完,感谢阅读 🌹

相关推荐
怕浪猫3 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
朝朝辞暮i4 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
Evand J4 小时前
【MATLAB例程】三维RRT+APF避障路径规划与到达角(AOA)定位算法|三维路径优化与定位仿真例程
算法·matlab·路径规划·代码·定位·rrt·aoa
weixin_307779136 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
朝朝辞暮i6 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
沙漠之主6 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
hasty6 小时前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
朝朝辞暮i6 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
Godspeed Zhao7 小时前
现代智能雷达技术14——算法(0)
线性代数·算法·雷达
Csvn7 小时前
diff 算法(虚拟 DOM Reconciliation)
前端