lynhao / day-by-day

每日更新一道算法题
MIT License
0 stars 0 forks source link

实现一个任务队列 #14

Open lynhao opened 5 years ago

lynhao commented 5 years ago

题目: 给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。

然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的最短时间。

eg: input: tasks = ["A","A","A","B","B","B"], n = 2 output: 8

注: 任务的总个数为 [1, 10000]。 n 的取值范围为 [0, 100]。

lynhao commented 5 years ago

解题: 思路: 数量最大的任务优先处理

function queue(tasks, n) {
  let q = ''
  let Q = {} // 描述任务分类
  tasks.forEach(item => {
    if (Q[item]) {
      Q[item]++
    } else {
      Q[item] = 1
    }
  })
  console.log(Q)
  while(1) {
    let keys = Object.keys(Q)
    if (!keys[0]) {
      break;
    }
    // n+1 为1组
    let tmp = []
    for(let i = 0; i<=n;i++) {
      let max = 0
      let key
      let pos
      //从所有任务找到未处理数最大最先安排
      keys.forEach((item,idx)=> {
        if (Q[item] > max) {
          max = Q[item]
          key = item
          pos = idx
        }
      })
      if (key) {
        tmp.push(key)
        keys.splice(pos,1)
        Q[key]--
        if (Q[key]<1) {
          delete Q[key]
        }
      } else {
        break
      }
    }
    console.log(tmp)
    q+=tmp.join('').padEnd(n+1, '-')
  }
  q = q.replace(/-+$/g, '')
  return q.length
}