上次迭代被跳过,并且不会在 for 循环中打印

last iteration gets skipped and not printed in a for loop

提问人:Adam Reddington 提问时间:6/8/2022 最后编辑:iczaAdam Reddington 更新时间:6/9/2022 访问量:51

问:

我试图构建一个代码,当用户输入一个数字序列时,它将通过比较每个数字的序列,对于序列中的每一个新的最大数字,它将对所有以前的数字求和

func main() {
    var numeri []int
    numeri = GetInputSlice()
    fmt.Println(numeri)
    var sum int
    num := len(numeri)
    for i := 0; i < num - 1 ; i++ {
        sum += numeri[i]
        if numeri[i] > numeri[i+1] || numeri[i] == num - 1 {
            fmt.Println(sum)
            sum = 0
        }
    }
}

完整的代码在这里:https://go.dev/play/p/13ljQPmKaRA

如果我输入这个数字序列 [1 2 13 0 7 8 9 -1 0 2],我想得到 16、24 和 1。 但是在我的代码中,我只得到 16 和 24,而没有得到最后一个 1,我想不出解决这个问题的方法。

for-loop go 切片

评论

0赞 icza 6/8/2022
only 被添加到 中,而你的循环永远不会访问最后一项 (),那么如何添加最后一项呢?numeri[i]sumi < num - 1
0赞 Adam Reddington 6/8/2022
我明白你的意思,但仍然不知道如何解决它

答:

0赞 icza 6/8/2022 #1

only 被添加到 中,而你的循环永远不会访问最后一项 (),那么如何添加最后一项呢?numeri[i]sumi < num - 1

在整个切片中进行范围,执行加法,但只有在最后一个元素不在最后一个元素时才与下一个元素进行比较。如果我们在最后一个,我们也想打印,所以我们可以使用一个条件

i == max || numeri[i] > numeri[i+1]

如果(短路评估),则不会执行与下一个元素的比较。i == max

例如:

max := len(numeri) - 1
for i, v := range numeri {
    sum += v
    if i == max || v > numeri[i+1] {
        fmt.Println(sum)
        sum = 0
    }
}

这将输出(在 Go Playground 上尝试):

[1 2 13 0 7 8 9 -1 0 2]
16
24
1