首页 > 解决方案 > 仅将流中的替代最低和最高值存储到数组中

问题描述

我有一个来自连续流的十进制值流。这些值从一个特定值开始,上升到某个最大值,然后下降到某个最小值(有点像波浪)。值的最大值和最小值并不总是相同,但可以保证的是值总是先上升然后下降,然后再上升和下降等等。

例如,值流可能如下所示:

  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 不是预期的结果。更好的解决方案是什么?

标签: javascriptalgorithmstreamdouble

解决方案


你可以这样做:

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);

这样做是为了跟踪流是向上还是向下(当前值大于或小于前一个值),并在流向下且当前值小于时替换输出数组中的最后一个值输出中的最后一个值或流上升并且当前值更大。


推荐阅读