携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
设计有序流
描述
有n个(id,value)对,其中id是1到n之间的整数,value是一个字符串,并且id的值各不相同。
设计一个流,以任意顺序获取n个(id,value)对,并在多次调用时返回以id递增的数据对。
主要实现:
- OrderedStream类,接收n个值的流,并将ptr设为1
- insert方法:向流中存储(id,value)对,如果存在以id增长的连续增长序列,则全部返回,否则返回空数组
分析
首先是要实现一个OrderedStream类,主要做两件事:
- 初始化ptr值,并且设为1;
- 生成一个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
};