1.华为OD真题[文件打印]

755 阅读2分钟

题目描述

有5台打印机打印文件,每台打印机有自己的待打印队列。

因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高

打印机会从自己的待打印队列中选择优先级最高的文件来打印。

如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。

现在请你来模拟这5台打印机的打印过程。

输入描述

每个输入包含1个测试用例,

每个测试用例第一行给出发生事件的数量N(0 < N < 1000)。

接下来有 N 行,分别表示发生的事件。共有如下两种事件:

  1. “IN P NUM”,表示有一个拥有优先级 NUM 的文件放到了打印机 P 的待打印队列中。(0< P <= 5, 0 < NUM <= 10);
  2. “OUT P”,表示打印机 P 进行了一次文件打印,同时该文件从待打印队列中取出。(0 < P <= 5)。

输出描述

  • 对于每个测试用例,每次”OUT P”事件,请在一行中输出文件的编号
  • 如果此时没有文件可以打印,请输出”NULL“。
  • 文件的编号定义为”IN P NUM”事件发生第 x 次

输入格式为:

6
IN 1 2
IN 3 4
IN 1 5
OUT 1
OUT 3
OUT 3

输出格式为:

3
2
NULL

解决代码 (不保证正确)

事后我想起来我之前错在哪了, 当时测试用例只过了20%, 这个应该能过80~90%以上

var readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
var inputs = [];
var inputsNum = 0;

var printMapQueue = {
  1: [], // {key: xx, n: number}
  2: [],
  3: [],
  4: [],
  5: [],
};

function fn() {
  let inputCount = 0;
  for (let i = 0; i < inputs.length; i++) {
    let item = inputs[i];
    if (item.opt === "IN") {
      let p = item.P;
      let n = item.N;
      ++inputCount;
      let index = printMapQueue[p].length;
      for (let j = 0; j < printMapQueue[p].length; j++) {
        let item = printMapQueue[p][j];
        if (n > item.n) {
          index = j;
          break;
        }
      }
      printMapQueue[p].splice(index, 0, { n: n, key: inputCount });
    } else if (item.opt === "OUT") {
      let p = item.P;
      let print = printMapQueue[p];
      if (print.length) {
        let item = print.shift();
        console.log(item.key);
      } else {
        console.log("NULL");
      }
    }
  }
}
rl.on("line", function (line) {
  var tokens = line.split(" ");
  if (inputsNum === 0) {
    inputsNum = +tokens[0];
  } else {
    inputs.push({
      opt: tokens[0],
      P: +tokens[1],
      N: tokens[2] ? +tokens[2] : 0,
    });
  }
  if (inputs.length === inputsNum) {
    fn();
  }
});

这个测试用例只通过20%

代码问题是我对IN,OUT分组了(///▽///),没有线性处理,一比如IN A 1,IN A 2,OUT A 这个时候 返回 2,没问题,如果测试用例是OUT A,IN A 1,IN A 2,正确应该返回 NULL,而我的还是返回2

var readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
var inputs = {
    IN: [],
    OUT: []
}
var inputsNum = 0

var printMapQueue = {
    1: [], // {key: xx, n: number}
    2: [],
    3: [],
    4: [],
    5: []
}

function fn(){
    for(let i = 0; i < inputs.IN.length; i++){
        let p = inputs.IN[i].P;
        let n = inputs.IN[i].N;
        let printKey = i + 1;
        let index = printMapQueue[p].length;
        for(let j = 0; j <  printMapQueue[p].length; j++){
            let item = printMapQueue[p][j]
            if(n > item.n){
                index = j
                break;
            }
        }
        printMapQueue[p].splice(index, 0, {n: n, key: printKey})
    }
    for(let i = 0; i < inputs.OUT.length; i++){
        let p = inputs.OUT[i].P;
        let print = printMapQueue[p];
        if(print.length){
            let item = print.shift();
            console.log(item.key)
        }else{
            console.log("NULL")
        }
    }
}
rl.on('line', function(line){
    var tokens = line.split(" ");
    if(inputsNum === 0){
        inputsNum = +tokens[0]
    }else{
        inputs[tokens[0]].push({
            P: +tokens[1],
            N: tokens[2] ? +tokens[2] : 0 
        })
    }
    if(inputs.IN.length + inputs.OUT.length === inputsNum){
        fn()
    }
});