求解波值的波峰和波谷「Javascript」

1,459 阅读2分钟

So,这篇文章,我们来谈谈,在一系列的电波数据中,我们应该怎么求解这一系列的数据的波峰和波谷呢?

Now,我们有一系列的数据 [150, 230, 224, 218, 135, 147, 260] 来举例:

波峰和波谷举例.png

在这 7 个数据中,波峰是 230260,波谷是 150135

PS:本文中知识点会应用到我的下一篇文章中

👌 Ok,那么我们应该如何通过代码来查找这些波峰和波谷呢?

思路

我们可以考虑如下的实现方式:

  1. 逐个遍历整个数组
  2. 设定数据是波峰记录为 1,数据是波谷记录为 -1,也就是 direction1 | -1
  3. (后一个数据 - 当前数据)* direction 是大于零的时候,对波峰波谷进行判断并累计统计
  4. 对数组第一个数据 arr[0] 和数组最后一个数据 arr[arr.length - 1] 进行判断

实现

思路我们有了,那么,我们来进行代码实现,这里我采用了 Javascript 语言进行编写:

function getCrestAndTrough(arr) { // arr 是一维数组,且元素类型是数字
  let crestCount = 0; // 波峰计数
  let crestArr = []; // 波峰值
  let troughCount = 0; // 波谷计数
  let troughArr = []; // 波谷值
  // 从右往左遍历
  let j = arr.length, // 数组长度
    i = j - 1, 
    last, // 上一个元素的值
    current, // 当前元素的值
    next, // 下一个元素的值
    difference; // 下一个元素对当前元素的差值
   let direction = arr[j] < 0 ? -1 : 1; // 假设是波峰的方向 1
   while(arr[i]) {
    next = arr[i - 1]; // 下一个元素
    current = arr[i]; // 当前元素
    difference = next - current; // 差值
    if(difference * direction > 0) {
      direction *= -1;
      if(direction === 1) {
        crestCount += 1; // 波峰
        crestArr.push(current);
      } else {
        troughCount += 1; // 波谷
        troughArr.push(current);
      }
      last = current;
    } else if(i === j - 1  && current !== next) { // 如果开始时候是曲线向下走的趋势,则 direction = 1 成立,最右年的点是波峰点
      crestCount += 1; // 波峰
      crestArr.push(current);
    }
    // 最左侧点判断
    if(next == undefined) {
      if(last < current) {
        crestCount += 1; // 波峰
        crestArr.push(current);
      }
      if(last > current) {
        troughCount += 1; // 波谷
        troughArr.push(current);
      }
      // 如果两点相等,则什么都不用做
    }
    i--; // 跳出循环的关键点
  }
  console.log(`波峰 => ${ crestArr },波谷 => ${ troughArr }`)
}

上面👆的代码已经讲解得很详细,读者跟着代码一步步读下来,应该很容易理解。

下面👇我们来验证下时候正确。我们依旧是拿数据 [150, 230, 224, 218, 135, 147, 260] 来进行验证:

let array = [150, 230, 224, 218, 135, 147, 260];
getCrestAndTrough(array);
// 波峰 => 260,230,波谷 => 135,150

你也可以通过掘金平台的线上 IDE 进行预览:

参考