当前位置: > > > > For 循环与 While 循环 – 荷兰国旗
For 循环与 While 循环 – 荷兰国旗
来源:stackoverflow
2024-04-27 08:27:34
0浏览
收藏
本篇文章给大家分享《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 循环 – 荷兰国旗》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注米云公众号,带你了解更多关于的知识点!
