javascript - 仅将流中的替代最低和最高值存储到数组中
问题描述
我有一个来自连续流的十进制值流。这些值从一个特定值开始,上升到某个最大值,然后下降到某个最小值(有点像波浪)。值的最大值和最小值并不总是相同,但可以保证的是值总是先上升然后下降,然后再上升和下降等等。
例如,值流可能如下所示:
0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.2,
1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0, 0.1,
0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.5,
0.4, 0.3, 0.2, 0.1, 0.0 ...
我需要的要求是将所有交替的最低和最高值存储到一个数组中。所以在上面的示例中,最终的结果数组应该是:
[0.3, 1.3, 0.0, 1.1, 0.0, ...]
这是我尝试的算法的伪代码:
var x;
var arr = [];
//listen to stream
//on stream event
void onEvent(double val) {
if (x == null) {
x = val;
}
if (val > x) {
if (arr.lastItem < val) {
arr.push(val);
}
} else {
if (arr.lastItem > val) {
arr.push(val);
}
}
x=val;
}
最终产生的 arr 不是预期的结果。更好的解决方案是什么?
解决方案
你可以这样做:
const stream = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.2,
1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0, 0.1,
0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.5,
0.4, 0.3, 0.2, 0.1, 0.0
];
const output = [];
let prevValue = null;
let isGoingUp = false;
function onEvent(value) {
if (output.length < 2) {
output.push(value);
if (output.length === 2) {
isGoingUp = output[0] < output[1];
prevValue = value;
}
return;
}
if (isGoingUp) {
if (value > prevValue) {
output[output.length - 1] = value;
} else if (value < prevValue) {
output.push(value);
isGoingUp = false;
}
} else {
if (value < prevValue) {
output[output.length - 1] = value;
} else if (value > prevValue) {
output.push(value);
isGoingUp = true;
}
}
prevValue = value;
}
stream.forEach(onEvent);
console.log(output);
这样做是为了跟踪流是向上还是向下(当前值大于或小于前一个值),并在流向下且当前值小于时替换输出数组中的最后一个值输出中的最后一个值或流上升并且当前值更大。
推荐阅读
- python - Python unittest 不运行测试
- javascript - 这个 Google Closure UTF-8 字符串有效吗?
- python - Selenium,BeatifulSoup,循环请求
- reactjs - 未找到模块:错误:无法解析“ReactDOM”
- .net - 如何仅在 PDFsharp 中加粗某些文本?
- c# - 使用 C# 中的绑定源计算 datagridview 中的填充行问题
- java - 在带有验证的while循环内输入字符
- html - HTML5 中输入类型属性 datetime 和 datetime-local 之间的区别
- elasticsearch - 使用 Elastic Search Python API 的字段最大值
- c++ - 带参数的方法 (const T *&) or (T * &) or(const T * const &) or(T * const &)