查找零以下的最大值

我试图从差异 n[i] - n[i-1] 时间序列中获取最大值。切片中的第一个值始终为零,下面是代码:


func MaxBelowZero(n ...float64) float64 {

var maxValue float64

if 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。我做错了什么?我将不胜感激。游乐场中的代码:链接


慕工程0101907
浏览 126回答 3
3回答

森林海

func MaxBelowZero(n ...float64) float64 {&nbsp; &nbsp; maxValue := -math.MaxFloat64 // Initial value must be negative&nbsp; &nbsp; if len(n) == 1 {&nbsp; &nbsp; &nbsp; &nbsp; return n[0]&nbsp; &nbsp; } else if len(n) == 0 {&nbsp; &nbsp; &nbsp; &nbsp; return 0.&nbsp; &nbsp; }&nbsp; &nbsp; for i := 1; i < len(n); i++ {&nbsp; &nbsp; &nbsp; &nbsp; diff := n[i] - n[i-1] // Correct logic here&nbsp; &nbsp; &nbsp; &nbsp; if diff > maxValue && diff < 0 {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; maxValue = diff&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return maxValue}

侃侃尔雅

您可以对切片进行反向排序,然后找到第一个负数:package mainimport "sort"func main() {&nbsp; &nbsp;a := []float64{0, 1, 2, -1, -2, -10, 10, 20}&nbsp; &nbsp;sort.Slice(a, func(d, e int) bool {&nbsp; &nbsp; &nbsp; return a[e] < a[d]&nbsp; &nbsp;})&nbsp; &nbsp;n := sort.Search(len(a), func(n int) bool {&nbsp; &nbsp; &nbsp; return a[n] < 0&nbsp; &nbsp;})&nbsp; &nbsp;println(a[n] == -1)}或者按符号排序,然后按绝对值排序:package mainimport "math"type sFunc func(a, b float64) boolvar sFuncs = []sFunc{&nbsp; &nbsp;func(a, b float64) bool {&nbsp; &nbsp; &nbsp; return math.Copysign(1, a) < math.Copysign(1, b)&nbsp; &nbsp;},&nbsp; &nbsp;func(a, b float64) bool {&nbsp; &nbsp; &nbsp; return math.Abs(a) < math.Abs(b)&nbsp; &nbsp;},}结果:package mainimport (&nbsp; &nbsp;"fmt"&nbsp; &nbsp;"sort")func main() {&nbsp; &nbsp;floats := []float64{0, 1, 2, -1, -2, -10, 10, 20}&nbsp; &nbsp;sort.Slice(floats, func(a, b int) bool {&nbsp; &nbsp; &nbsp; fa, fb := floats[a], floats[b]&nbsp; &nbsp; &nbsp; for _, sf := range sFuncs {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if sf(fa, fb) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if sf(fb, fa) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp;})&nbsp; &nbsp;fmt.Println(floats) // [-1 -2 -10 0 1 2 10 20]}https://golang.org/pkg/sort#Searchhttps://golang.org/pkg/sort#Slice

紫衣仙女

math.SmallestNonzeroFloat64是最接近 0 且不是 0 的数字,而不是离零最远的数字。试试这个:去游乐场func MaxBelowZero(values ...float64) float64 {&nbsp; &nbsp; if len(values) == 0 {&nbsp; &nbsp; &nbsp; &nbsp; return 0&nbsp; &nbsp; } else if len(values) == 1 {&nbsp; &nbsp; &nbsp; &nbsp; return values[0]&nbsp; &nbsp; }&nbsp; &nbsp; max := -math.MaxFloat64&nbsp; &nbsp; for _, n := range values {&nbsp; &nbsp; &nbsp; &nbsp; if n >= 0 {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if n > max {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; max = n&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return max}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go