开启我的LeetCode刷题日记:1606. 找到处理最多请求的服务器

451 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:1606. 找到处理最多请求的服务器

你有 k 个服务器,编号为 0 到 k-1 ,它们可以同时处理多个请求组。每个服务器有无穷的计算能力但是 不能同时处理超过一个请求 。请求分配到服务器的规则如下:

  • 第 i (序号从 0 开始)个请求到达。
  • 如果所有服务器都已被占据,那么该请求被舍弃(完全不处理)。
  • 如果第 (i % k) 个服务器空闲,那么对应服务器会处理该请求。
  • 否则,将请求安排给下一个空闲的服务器(服务器构成一个环,必要的话可能从第 0 个服务器开始继续找下一个空闲的服务器)。比方说,如果第 i 个服务器在忙,那么会查看第 (i+1) 个服务器,第 (i+2) 个服务器等等。 给你一个 严格递增 的正整数数组 arrival ,表示第 i 个任务的到达时间,和另一个数组 load ,其中 load[i] 表示第 i 个请求的工作量(也就是服务器完成它所需要的时间)。你的任务是找到 最繁忙的服务器 。最繁忙定义为一个服务器处理的请求数是所有服务器里最多的。

请你返回包含所有 最繁忙服务器 序号的列表,你可以以任意顺序返回这个列表。

我的思路

服务器共k台 用长度为k数组freeTime,存每台服务器什么时间空闲 用长度为k数组r,存每台服务器处理请求次数 遍历请求到达时间数组arrival,模拟依次收到请求 拟将请求发送至第i % k号服务器,标记为起点 请求时间 < 服务器空闲时间,当前服务器忙,+1下一台 直到最后一台,再从0开始找 回到起点,说明找了一圈,没找到,跳出循环并跳到下一个请求 请求时间 >= 服务器空闲时间,当前服务器已空闲,跳出循环 当前服务器的空闲时间,延后至 = 当前请求时间 + 请求处理时间 当前服务器处理请求的次数 +1,记录到数组r 最后返回处理请求次数数组r中的最大值的索引数组即可

代码实现

var busiestServers = function(k, arrival, load) {
  const freeTime = new Uint32Array(k), r = new Uint32Array(k), n = arrival.length
  label: for (let i = 0; i < n; i++) { // 用 label 标记此循环
    const time = arrival[i], duration = load[i]
    let server = start = i % k
    while (time < freeTime[server]) {
      if (server < k) server++
      if (server === k) server = 0
      if (server === start) continue label // 直接继续标记为 label 的循环,跳两层
    }
    freeTime[server] = time + duration
    r[server]++
  }
  let ans = [], max = 0
  for (let i = 0; i < k; i++) {
    if (r[i] > max) {
      ans = [i]
      max = r[i]
    } else if (r[i] === max) ans.push(i)
  }
  return ans
};


总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹