为了账号安全,请及时绑定邮箱和手机立即绑定

查找零以下的最大值

查找零以下的最大值

Go
慕工程0101907 2022-09-12 16:11:01
我试图从差异 n[i] - n[i-1] 时间序列中获取最大值。切片中的第一个值始终为零,下面是代码:func MaxBelowZero(n ...float64) float64 {var maxValue float64if len(n) == 1 {    return n[0]} else if len(n) == 0 {    return 0.}for i := range n {    if i == 0 {        maxValue = math.SmallestNonzeroFloat64        continue    }    if maxValue < n[i] && n[i] < 0 {        maxValue = n[i]    }}return maxValue}var sliceTest = []float64{0, 1, 2, -1, -2, -10, 10, 20}MaxBelowZero(sliceTest...)Output: 5e-324它假设为-1。我做错了什么?我将不胜感激。游乐场中的代码:链接
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

func MaxBelowZero(n ...float64) float64 {

    maxValue := -math.MaxFloat64 // Initial value must be negative

    if len(n) == 1 {

        return n[0]

    } else if len(n) == 0 {

        return 0.

    }

    for i := 1; i < len(n); i++ {

        diff := n[i] - n[i-1] // Correct logic here

        if diff > maxValue && diff < 0 {

            maxValue = diff

        }

    }

    return maxValue

}


查看完整回答
反对 回复 2022-09-12
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

您可以对切片进行反向排序,然后找到第一个负数:


package main

import "sort"


func main() {

   a := []float64{0, 1, 2, -1, -2, -10, 10, 20}

   sort.Slice(a, func(d, e int) bool {

      return a[e] < a[d]

   })

   n := sort.Search(len(a), func(n int) bool {

      return a[n] < 0

   })

   println(a[n] == -1)

}

或者按符号排序,然后按绝对值排序:


package main

import "math"


type sFunc func(a, b float64) bool


var sFuncs = []sFunc{

   func(a, b float64) bool {

      return math.Copysign(1, a) < math.Copysign(1, b)

   },

   func(a, b float64) bool {

      return math.Abs(a) < math.Abs(b)

   },

}

结果:


package main


import (

   "fmt"

   "sort"

)


func main() {

   floats := []float64{0, 1, 2, -1, -2, -10, 10, 20}

   sort.Slice(floats, func(a, b int) bool {

      fa, fb := floats[a], floats[b]

      for _, sf := range sFuncs {

         if sf(fa, fb) {

            return true

         }

         if sf(fb, fa) {

            break

         }

      }

      return false

   })

   fmt.Println(floats) // [-1 -2 -10 0 1 2 10 20]

}

https://golang.org/pkg/sort#Search

https://golang.org/pkg/sort#Slice



查看完整回答
反对 回复 2022-09-12
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

math.SmallestNonzeroFloat64是最接近 0 且不是 0 的数字,而不是离零最远的数字。试试这个:


去游乐场


func MaxBelowZero(values ...float64) float64 {

    if len(values) == 0 {

        return 0

    } else if len(values) == 1 {

        return values[0]

    }

    max := -math.MaxFloat64

    for _, n := range values {

        if n >= 0 {

            continue

        }

        if n > max {

            max = n

        }

    }

    return max

}


查看完整回答
反对 回复 2022-09-12
  • 3 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号