現在Go言語で、「スライスを前から走査して、そこまでのスライスの最小要素が元のスライスの最後の要素ならカウントする」のような処理を実装していて、以下のようなコードを書きました。
go
1package main 2 3import ( 4 "fmt" 5 "sort" 6) 7 8func minSlice(num []int)int{ 9 sort.Ints(num) 10 return num[0] 11} 12 13func main() { 14 var n int 15 fmt.Scan(&n) 16 count := 1 17 p := make([]int, n) 18 for i:=0; i<n; i++{ 19 fmt.Scan(&p[i]) 20 } 21 // 前から走査して、そこまでのスライスの最小要素が最後の要素ならcount++ 22 // 参照のせいでおかしくなってる、ソートされてる?? 23 for i:=1; i<=len(p); i++{ 24 fmt.Println(minSlice(p[0:i])) 25 fmt.Println(p[0:i]) 26 if minSlice(p[0:i]) == p[i-1]{ 27 count++ 28 } 29 } 30 31 fmt.Print("カウント:") 32 fmt.Println(count) 33}
しかし、スライスを関数の引数に渡すと元のスライスまでソートされてしまい、期待する結果が得られません。
以下実行結果と、求めたい結果です。
実行結果
zsh
1> go run main.go 28 35 7 4 2 6 8 1 3 4 55 6[5] 75 8[5 7] 94 10[4 5 7] 112 12[2 4 5 7] 132 14[2 4 5 6 7] 152 16[2 4 5 6 7 8] 171 18[1 2 4 5 6 7 8] 191 20[1 2 3 4 5 6 7 8] 21カウント:2
求める結果
zsh
1> go run main.go 28 35 7 4 2 6 8 1 3 4 55 6[5] 75 8[5 7] 94 →ここでカウント 10[5 7 4] 112 →ここでカウント 12[5 7 4 2] 132 14[5 7 4 2 6] 152 16[5 7 4 2 6 8] 171 →ここでカウント 18[5 7 4 2 6 8 1] 191 20[5 7 4 2 6 8 1 3] 21カウント:4
スライスを関数の引数に渡すさいにもとのスライスまで影響を及ぼさないようにするのはどうすればよいでしょうか?
また他のほうほうなどありましたら教えていただきたいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。