当前位置: > > > > 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 循环 – 荷兰国旗》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注公众号,带你了解更多关于的知识点!