找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 12398|回复: 6

挑出峰值数字和所处位置(coderwars 5级挑战题)

[复制链接]
发表于 2020-5-29 17:54:35 | 显示全部楼层 |阅读模式
本帖最后由 ivor 于 2020-5-29 21:53 编辑

看着还不错,和大家分享一下。


名称:挑出峰值数字和所处位置

详细介绍:

例子1, 数组 arr = [0, 1, 2, 5, 1, 0] 峰值索引位置在 3,峰值对应为 5 (since arr[3] equals 5). 结果:{pos: [3], peaks: [5]}
例子2,数组 arr = [1,2,5,4,3,2,3,6,4,1,2,3,3,4,5,3,2,1,2,3,5,5,4,3]), 索引位置在[2,7,14,20] 峰值对应为[5,6,5,5]  结果 :{"pos":[2,7,14,20], "peaks":[5,6,5,5]})


抛砖引玉附上Python代码:
  1. a = [11, 20, 14, 4, 5, 4, 8, 17, 14, 9, 17, 20, 8, 19, 17, 15, 13, 20, 16, 7, 2, 11, 14, 18, 11, 2, 15, 1, 5, 4, 5, 1, 6, 6, 9, 13, 18, 19, 9, 17, 12, 19, 17, 2, 13, 9, 19, 2, 11]
  2. def pick_peaks(arr):
  3.     pos = []
  4.     prob_peak = False
  5.     for i in range(1, len(arr)):
  6.         if arr[i] > arr[i-1]:
  7.             prob_peak = i
  8.         elif arr[i] < arr[i-1] and prob_peak:
  9.             pos.append(prob_peak)
  10.             prob_peak = False
  11.     return {'pos':pos, 'peaks':[arr[i] for i in pos]}
  12. print(pick_peaks(a))
复制代码
发表于 2020-5-29 19:20:53 | 显示全部楼层
这个峰值有什么范围吗?
 楼主| 发表于 2020-5-29 20:09:43 | 显示全部楼层
回复 2# Gin_Q


    比如:例子2索引位置14比左右数值都小,如果和右边数值相等,则继续往后找,找到后才能确定14位置为峰值,如果右边找不到更小的数值则不成立。

形象比喻就像山头。
发表于 2020-5-29 21:13:17 | 显示全部楼层
那第一位和最后一位是不是漏掉了?

评分

参与人数 1技术 +1 收起 理由
ivor + 1 是的,第一位和最后不能做峰值

查看全部评分

发表于 2020-5-31 19:55:00 | 显示全部楼层
严格说,前后都要算,
补个 ps

  1. $A = 20, 14, 4, 5, 4, 8, 17, 14, 9, 17, 20, 8, 19, 17, 15, 13, 20, 16, 7, 2, 11, 14, 18, 11, 2, 15, 1, 5, 4, 5, 1, 6, 6, 9, 13, 18, 19, 9, 17, 12, 19, 17, 2, 13, 9, 19, 2, 11;
  2. Function Get-SpaceValue {
  3.         param(
  4.                 [Parameter(Mandatory = $true)][double[]]$arr,
  5.                 [ValidateSet(0, -1)][sbyte]$y = -1 #[0]不计算两端 [-1]计算两端
  6.         )

  7.         $r = for ($i = $y; $i -lt $arr.Count - 2 - $y; $i++) {
  8.                 if ([Linq.Enumerable]::Max([double[]]$arr[$i..($i + 2)]) -eq $arr[$i + 1]) {
  9.                         @{p = $i + 1; v = $arr[$i + 1] }
  10.                 }
  11.         }
  12.         return ConvertTo-Json -Input @{位置 = $r.p; 峰值 = $r.v } -Comp
  13. }
  14. Get-SpaceValue -arr $A
复制代码
结果
  1. {"峰值":[20,5,17,20,19,20,18,15,5,5,6,19,17,19,13,19,11],"位置":[0,3,6,10,12,16,22,25,27,29,31,36,38,40,43,45,47]}
复制代码

评分

参与人数 1技术 +1 收起 理由
ivor + 1 不符合题目要求,请参考例子2.不只是简单的 ...

查看全部评分

 楼主| 发表于 2020-6-1 08:03:58 | 显示全部楼层
回复 5# xczxczxcz


    忽略了一种相邻两个(或更多个)数可能是相等的情况。
发表于 2020-6-1 09:36:50 | 显示全部楼层
回复 6# ivor


    确实忽略了,看来还是挨个比简单。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 03:39 , Processed in 0.018955 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表