質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

1回答

668閲覧

Go言語でスライスを関数にわたすときの挙動変更

tedmosby

総合スコア46

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/06/23 11:17

編集2020/06/23 11:20

現在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

スライスを関数の引数に渡すさいにもとのスライスまで影響を及ぼさないようにするのはどうすればよいでしょうか?
また他のほうほうなどありましたら教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

スライスから最小値が欲しいのならsortするまでも無いということでこれでどうでしょうか。

https://play.golang.org/p/4oN6DnnlymC

go

1package main 2 3import ( 4 "bytes" 5 "fmt" 6 "io" 7 "os" 8) 9 10const src = `8 115 7 4 2 6 8 1 3 12` 13 14func init() { 15 go func() { 16 os.Stdin.Write([]byte(src)) 17 os.Stdin.Close() 18 }() 19} 20 21func minSlice(num []int) int { 22 min := 1<<32 - 1 // intmax 23 for _, v := range num { 24 if min > v { 25 min = v 26 } 27 } 28 return min 29} 30 31func proc(fp io.Reader) { 32 var n int 33 fmt.Fscan(fp, &n) 34 count := 1 35 p := make([]int, n) 36 for i := 0; i < n; i++ { 37 fmt.Fscan(fp, &p[i]) 38 } 39 // 前から走査して、そこまでのスライスの最小要素が最後の要素ならcount++ 40 // 参照のせいでおかしくなってる、ソートされてる?? 41 for i := 1; i <= len(p); i++ { 42 fmt.Println(minSlice(p[0:i])) 43 fmt.Println(p[0:i]) 44 if minSlice(p[0:i]) == p[i-1] { 45 count++ 46 } 47 } 48 49 fmt.Print("カウント:") 50 fmt.Println(count) 51} 52 53func main() { 54 //proc(os.Stdin) 55 buff := bytes.NewBufferString(src) 56 proc(buff) 57}

投稿2020/06/23 12:03

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問