我在这里有一个Go语言问题,与下面的代码相比,有没有更好的方法来回答编码Golang的答案?
Mangkuk是由最大大小的Sudu组成的列表。
Sudu是连续整数的排列,可能带有重复项。
Cawan是Mangkuk,其中每个Sudu都按升序排序。
编写一个函数MakeCawan(→Mangkuk),将给定的Mangkuk排序为Cawan。
For example,
MakeCawan([21, 20, 18, 20, 18, 20, 19]),
MakeCawan([21, 2000000, 18, 20, 18, 20, 19]),
MakeCawan([21, 20, 18, 20, 18, 20, 1900000])
should produce, respectively,
[18, 18, 19, 20, 20, 20, 21],
[21, 2000000, 18, 18, 19, 20, 20],
[20, 21, 18, 20, 18, 20, 1900000].
package main
import (
"fmt"
"sort"
)
func main() {
sl := []string{"MakeCawan"}
sort.Sort(sort.StringSlice(sl))
fmt.Println(sl)
sl1 := []string{"MakeCawan"}
sort.Sort(sort.StringSlice(sl1))
fmt.Println(sl1)
sl2 := []string{"MakeCawan"}
sort.Sort(sort.StringSlice(sl2))
fmt.Println(sl2)
intSlice := []int{21,20,18,20,18,20,19}
sort.Sort(sort.IntSlice(intSlice))
fmt.Println(intSlice)
}
输出:
https://play.golang.org/p/tsE0BtMRos_9
最佳答案
这个问题有点棘手:它不会要求您对整个 slice 进行排序(或用自己的术语对mangkuk进行排序);它要求您首先识别所有连续的间隔(带有可能的重复元素),这称为sudu,然后对每个sudu进行排序。
func makeCawan(mangkuk []int) []int {
for now, n := 0, len(mangkuk); now < n; {
min := mangkuk[now]
max := min
head := now
loop:
for now++; now < n; now++ {
switch x := mangkuk[now]; {
case x < min-1 || x > max+1:
sort(mangkuk[head:now], min, max)
break loop
case x == min-1:
min = x
case x == max+1:
max = x
}
}
if now >= n {
sort(mangkuk[head:now], min, max)
}
}
return mangkuk
}
游乐场:https://play.golang.org/p/z3TGWnWnrVY
关于go - golang 升序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54733310/