讨论/技术交流/使用js刷题中的提示开启es6特性和使用priority-queue/
使用js刷题中的提示开启es6特性和使用priority-queue

使用javascript刷题,提示中说

“您的代码在执行时将带上 --harmony 标记来开启 新版ES6特性。
lodash.js 库已经默认被包含。
如需使用队列/优先队列,您可使用 datastructures-js/priority-queue 和 datastructures-js/queue。”,

那么
--harmony 标记来开启,是怎么操作呢?
priority-queue这个又是怎么使用呢?
image.png


评论解释说--harmony是在node环境中添加了这个变量,使得我们的js刷题环境能够支持es6。感谢@sh-winter解惑。


然后priority-queue也是可以直接在js刷题环境中使用的。非常感谢@zuncheng解惑。

这里我对js使用自带优先队列,稍做总结。

  1. 实例化时回调为空,加入元素时必须指定优先级
let a=1,b=2,c=5;
let p=new MinPriorityQueue();
p.enqueue(a,a);//传入的第二个值表示的是指定当前元素的优先级,
p.enqueue(b,b);//即使是纯数字也必须指定该数字的优先级,不能省略。
//这里priority-queue官方解释的是leetcode使用的是老版本的PriorityQueue库,
//不支持数字默认为优先级,所以不能省略。

console.log(p.dequeue().element);//打印出队元素
console.log(p.front().element);//打印队首元素
  1. 实例化时在priority的回调函数中指定哪个属性值作为优先级。加入元素不用指定优先级。
const p= new MinPriorityQueue({
	priority: (item) => item.age  //指定传入值的某个属性作为优先级,该值需要返回Number型
})
	
let a ={name:"zhangsan",age:13};
let b ={name:"lisi",age:23};

p.enqueue(a);//实例化时有回调函数,这里就不用再指定优先级
p.enqueue(b);
console.log(p.toArray())

优先队列更多的使用特性可以参考priority-queue

共 12 个回复

貌似你也有做上周周赛那个 cpu 的题哈,就粘这个题的代码了

/**
 * @param {number[][]} tasks
 * @return {number[]}
 */
// const { MinPriorityQueue, MaxPriorityQueue } = require('@datastructures-js/priority-queue');
var getOrder = function(tasks) {
  const len = tasks.length
  // 用下标引用 task
  const taskCopy = new Array(len).fill(0).map((_, index) => index)
  // tasks 按入栈顺序先排列
  taskCopy.sort((a, b) => {
    const taskA = tasks[taskCopy[a]]
    const taskB = tasks[taskCopy[b]]
    return taskA[0] === taskB[0] ? taskA[1] - taskB[1] : taskA[0] - taskB[0]
  })
  
  const ret = []
  const pq = new MinPriorityQueue({
    // 执行时长作为整数部分,序号作为小数部分
    priority: (taskIndex) => tasks[taskIndex][1] + taskIndex / len
  })
  // 第一个任务进栈
  pq.enqueue(taskCopy.shift())
  // t 指代当前任务的结束时间
  let t = tasks[pq.front().element][0]

  while (taskCopy.length || !pq.isEmpty()) {
    if (pq.isEmpty()) {
      pq.enqueue(taskCopy.shift())
      t = tasks[pq.front().element][0]
    }
    const currentTaskIndex = pq.dequeue().element
    const currentTask = tasks[currentTaskIndex]
    t += currentTask[1]
    // 把在当前任务结束之前插入的任务,添加进来
    while (taskCopy.length && tasks[taskCopy[0]][0] <= t) {
      pq.enqueue(taskCopy.shift())
    }
    // 当前的任务就可以结束了
    ret.push(currentTaskIndex)
  }
  return ret
};
2

我当时没说清楚,本来也觉得奇怪,数字类型怎么没有被作为默认的优先度👍

1

明白了明白了,非常感谢。看到官方说数值型可以默认为优先级,但是老版本不支持。

js使用自带优先队列,两种用法总结

1. 实例化时回调为空,加入元素时必须指定优先级

let a=1,b=2,c=5;
let p=new MinPriorityQueue();
p.enqueue(a,a);//传入的第二个值表示的是指定当前元素的优先级,
p.enqueue(b,b);//即使是纯数字也必须指定该数字的优先级,不能省略。
//这里官方解释的是leetcode使用的是老版本的PriorityQueue库,不支持数字默认为优先级,所以不能省略。

console.log(p.dequeue().element);//打印出队元素
console.log(p.front().element);//打印队首元素

2.实例化时在priority的回调函数中指定哪个属性值作为优先级。

    const p= new MinPriorityQueue({
        priority: (item) => item.age  //指定传入值的某个字段作为优先级,该值需要返回Number型
    })
		
		let a ={name:"zhangsan",age:13};
		let b ={name:"lisi",age:23};
		
		p.enqueue(a);//实例化时有回调函数,这里就不用再指定优先级
		p.enqueue(b);
1

应该是需要传入一个处理 priotity 的回调,或者入栈的时候就要传入这个值的优先级。

1

哇 等会试试

1

他的大致意思就是说这个代码会在 node 环境下运行,因为添加了这个标志,所以可以使用es 6语法,至于后面那两长串英文,那应该是第三方类库,用来提供队列和优先队列的功能,应该是通过import 或 require 引入使用的

1

一样一样的,上周周赛第三题就因为js没有这个优先队列没搞出来。

我是这样使用的,但是报错,不知道怎么处理。你可以给个示例代码看看吗?

const p = new MinPriorityQueue();
p.enquene(3);   //没有这一行是可以打印出p的结构的
console.log(p);

打印报错:

/.nvm/versions/node/v14.8.0/lib/node_modules/@datastructures-js/priority-queue/src/priorityQueue.js:79
      throw new Error('missing priority number or constructor callback');
      ^
Error: missing priority number or constructor callback
    Line 79: Char 13 in priorityQueue.js (MinPriorityQueue.enqueue)
    Line 11: Char 18 in solution.js (removeElement)
    Line 36: Char 19 in solution.js (Object.<anonymous>)
    Line 16: Char 8 in runner.js (Object.runner)
    Line 25: Char 26 in solution.js (Object.<anonymous>)
    Line 1251: Char 30 in loader.js (Module._compile)
    Line 1272: Char 10 in loader.js (Object.Module._extensions..js)
    Line 1100: Char 32 in loader.js (Module.load)
    Line 962: Char 14 in loader.js (Function.Module._load)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)

👴佛了,这几天才因为 js pq 的缺失换成了 py 刷题

兄弟我试过了,直接用就可以。
// const { MinPriorityQueue, MaxPriorityQueue } = require('@datastructures-js/priority-queue');
不需要引入,直接 new MinPriorityQueue() 就行,你可以去那两个链接看看他们怎么用的就行。