登录
首页 >  Golang >  Go问答

For 循环与 While 循环 - 荷兰国旗

来源:stackoverflow

时间:2024-04-27 08:27:34 104浏览 收藏

本篇文章给大家分享《For 循环与 While 循环 - 荷兰国旗》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我正在尝试在golang中使用for循环和while循环来实现荷兰国旗问题。

问题陈述 - 对于给定的数组,以这样的方式排列元素:大于主元的元素位于主元的右侧,小于数组的元素位于数组的左侧。 示例-

输入 - [3 2 4 1 6 3 7 5] ,枢轴 = 4

输出 - [3 2 1 3 4 7 5 6]

for循环实现[未按预期工作]

package main

import (
    "fmt"
)

func main() {
    in := []int{3, 2, 4, 1, 6, 3, 7, 5}
    pivot := 4
    run(in, pivot)

}

func run(in []int, pivot int) {

    fmt.println("before : ", in)

    lboundary := 0

    hboundary := len(in) - 1

    for i := 0; i <= hboundary; i++ {
        if in[i] > pivot {
            in[i], in[hboundary] = in[hboundary], in[i]
            hboundary--
        } else if in[i] < pivot {
            in[i], in[lboundary] = in[lboundary], in[i]
            lboundary++
        }
    }

    fmt.println("after: ", in)

}

while 循环实现 [按预期工作] -

package main

import (
    "fmt"
)

func main() {
    in := []int{3, 2, 4, 1, 6, 3, 7, 5}
    pivot := 4
    run(in, pivot)

}

func run(in []int, pivot int) {

    fmt.Println("before : ", in)

    i := 0
    lBoundary := 0

    hBoundary := len(in) - 1

    for i <= hBoundary {
        if in[i] > pivot {
            in[i], in[hBoundary] = in[hBoundary], in[i]
            hBoundary--
        } else if in[i] < pivot {
            in[i], in[lBoundary] = in[lBoundary], in[i]
            lBoundary++
            i++
        } else {
            i++
        }
    }
    fmt.Println("after: ", in)
}

我无法识别 for 循环实现中的问题。


解决方案


问题是,如果您更新 while 循环计数器 i 仅适用于两个条件,即

else if in[i] < pivot {
        in[i], in[lboundary] = in[lboundary], in[i]
        lboundary++
        i++
    } else {
        i++
    }

但是在 for 循环的情况下,由于 i++,每次执行循环时计数器都会递增。

因此,如果您更新 for 循环代码以将增量条件放入循环内,它将按预期运行:

package main

import (
    "fmt"
)

func main() {
    in := []int{3, 2, 4, 1, 6, 3, 7, 5}
    pivot := 4
    run(in, pivot)

}

func run(in []int, pivot int) {

    fmt.Println("before : ", in)

    lBoundary := 0

    hBoundary := len(in) - 1
    // remove i++ condition
    for i := 0; i <= hBoundary; {
        if in[i] > pivot {
            in[i], in[hBoundary] = in[hBoundary], in[i]
            hBoundary--  // no increment in this condition
        } else if in[i] < pivot {
            in[i], in[lBoundary] = in[lBoundary], in[i]
            lBoundary++
            i++  // add the increment condition here
        } else {
            i++ // and here as well
        }

    }

    fmt.Println("after: ", in)

}

到这里,我们也就讲完了《For 循环与 While 循环 - 荷兰国旗》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>