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



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

问题陈述-对于给定的阵列,以这样的方式布置元素,即大于枢轴的元素在枢轴的右侧,而小于阵列的元素在阵列的左侧。示例-

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

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

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

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 loop implementation[WORKING AS EXPECTED]-

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的情况下,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)
}

最新更新