设计有序流

53 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

设计有序流

描述

有n个(id,value)对,其中id是1到n之间的整数,value是一个字符串,并且id的值各不相同。

设计一个流,以任意顺序获取n个(id,value)对,并在多次调用时返回以id递增的数据对。

主要实现:

  1. OrderedStream类,接收n个值的流,并将ptr设为1
  2. insert方法:向流中存储(id,value)对,如果存在以id增长的连续增长序列,则全部返回,否则返回空数组

分析

首先是要实现一个OrderedStream类,主要做两件事:

  1. 初始化ptr值,并且设为1;
  2. 生成一个map对象用于接收(id,value)对

实现insert方法。insert方法接收两个参数,也就是(id,value),在insert方法中,要实现的第一个功能就是给数据流中新增键值为id的值value。

第二个功能涉及到返回值的运算规则,在插入一个新键值之后,我们需要看ptr当前的位置,如果ptr当前指向的键值为空,则返回空数组;如果插入值之后,当前ptr位置对应的id有值,就放入返回数组中,同时ptr需要加一,然后不断往后循环,直到非空则终止赋值并返回,ptr就停留在存在值对应的id+1的位置上。

具体实现的话:我们循环数据流,从ptr指针指向的位置开始,当值不为空,则放入返回结果,ptr加一,值为空,则中断循环,直接已放入数组的结果。

程序实现

根据以上分析,代码实现如下:

/**
 * @param {number} n
 */
var OrderedStream = function(n) {
  this.ptr = 1
  this.map = new Map()
  for (let i = 1; i <= n; i++) {
    this.map.set(i, '')
  }
};

/** 
 * @param {number} idKey
 * @param {string} value
 * @return {string[]}
 */
OrderedStream.prototype.insert = function(idKey, value) {
  // 先插入新(id, value)对
  this.map.set(idKey, value)
  // 找出从ptr开始的最长id连续递增序列
  let retArr = []
  const start = this.ptr
  for (let i = start; i <= this.map.size; i++) {
    const val = this.map.get(i)
    if (val) {
      retArr.push(val)
      // 有值则ptr往后推移
      ++this.ptr
    } else {
      return retArr
    }
  }
  return retArr
};