【问题标题】:How to implement a queue in javascript in a short time when coding during interview?面试编码时如何在短时间内用javascript实现队列?
【发布时间】:2019-05-26 17:37:12
【问题描述】:

我想知道当我在 leetcode 上编码时,是否有任何内置模块或包可以用于在 javascript 中实现 queue。如您所知,在面试期间不可能花费太多时间来手动实现队列。当我使用 python 时,我总是喜欢使用一个名为 collections 的模块,其中包含一个类 deque。但是在浏览堆栈溢出之后,我发现大多数答案都在告诉人们如何从头开始在 javascript 中实现队列。我正在寻找一种方便的方法来实现它。有人可以帮忙吗?

Hmmmmmmmm,似乎没有比仅使用数组更好的方法来实现队列。它似乎基于javascript引擎本身。这是一个关于它的链接:time complexity of unshift() vs. push() in Javascript

【问题讨论】:

    标签: javascript queue


    【解决方案1】:

    对于呼吸优先搜索。旋转 2 个数组可能会有所帮助。 FIFO 的平均 O(1) 时间。

    【讨论】:

      【解决方案2】:

      queue 是一个 FIFO 结构,其中列表中第一个插入的元素是第一个被取出的元素。

      在 JavaScript 中,您可以轻松地使用数组来实现此逻辑。

      shift 方法返回并移除数组的第一个元素(就像dequeue 所做的那样),所以如果你使用push 添加元素,并使用shift 删除元素,你实际上是在使用队列。

      下面是一个例子:

      const a = [];
      a.push(3);
      a.push(5);
      a.push(7);
      
      console.log(a.shift());

      同样,您甚至可以使用unshift 在数组开头添加,pop 从数组末尾删除。

      结果始终是一个 FIFO 结构,其中您添加的第一个元素是第一个被删除的元素:

      const a = [];
      a.unshift(3);
      a.unshift(5);
      a.unshift(7);
      
      console.log(a.pop());

      虽然在 JavaScript 中实现堆栈可以用简单的数组在 O(1) 中完成,通过 pushpop 需要 O(1),如上实现的队列应该需要 O(1) 来插入和O(n) 在最坏的情况下移除。

      您可以采用一种更好的时间复杂度方法,它应该允许您在 O(1) 中为插入和删除实现一个队列,可以使用 Map 完成,如下所示:

      class MyQueue extends Map {
        constructor() {
          super();
          this.insertionIndex = 0;
          this.removalIndex = 0;
        }
      
        queue(element) {
          this.set(this.insertionIndex, element);
          this.insertionIndex++;
        }
      
        dequeue() {
          const el = this.get(this.removalIndex);
          if (typeof el !== 'undefined') {
            this.delete(this.removalIndex);
            this.removalIndex++;
          }
          return el;
        }
      }
      
      const q = new MyQueue();
      q.queue(1);
      q.queue(2);
      console.log(q.dequeue());
      console.log(q.dequeue());
      q.queue(3);
      console.log(q.dequeue());
      console.log(q.dequeue()); // now is empty so dequeue will return undefined with no errors
      q.queue(4);
      console.log(q.dequeue());

      【讨论】:

      • 感谢您的回答。但据我所知,如果我实现基于数组的队列,当我从该队列的头部推入或弹出元素时,它无法为我提供 O(1) 时间复杂度。
      • 我觉得面试的时候肯定不能满足时间复杂度的要求。
      • 据我所知,JS中在数组末尾插入元素和从数组末尾删除元素的时间复杂度是O(1)(所以pushpop )。 shiftunshift 的最坏情况应该是 O(n)。但我希望有人可以发布一些更相关的信息。关于面试,我曾经收到过类似的问题,关于 js 中的堆栈(LIFO),我确实使用了带有 unshiftpop 方法的 arryas,他们对此感到满意。在 JS 中你只有对象,甚至数组也是对象。没有更好的数据结构甚至可以使用零实现它
      • 好的,我明白了。感谢分享。
      • 对不起,我指的是pushpop当然是lifo
      猜你喜欢
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2021-05-29
      • 2018-11-14
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多