#头条创作挑战赛#

本文同步本人掘金平台的文章:https://juejin.cn/post/7143782444708134948

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

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

在这 7 个数据中,波峰是 230 和 260,波谷是 150 和 135。

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

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

思路

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

逐个遍历整个数组

设定数据是波峰记录为 1,数据是波谷记录为 -1,也就是 direction 为 1 | -1

(后一个数据 - 当前数据)* direction 是大于零的时候,对波峰波谷进行判断并累计统计

对数组第一个数据 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

复制代码

ogp光学影像测量机

ogp光学影像测量机

ogp光学影像测量机

影像测量仪器公司