オンラインジャッジ向けGo言語構文ガイド

Javaとの主な構文の違い:

1) ++iは存在せず、i++のみ使用可能。whileループはなく、「for 条件」で代替。未使用の変数は定義不可。
   整数型のmax、min、abs関数は標準で提供されていない。
2) 配列のサイズが定数でない場合、makeキーワードを使用してsliceを定義する必要がある。
   クラスはなく、funcのみ存在。クラスに相当するものはstructキーワードで定義する。
3) Goでは初期化されていないslice、map、channelはnilキーワードで判定できる。

Go言語の特殊キーワード:

キーワード 説明
range array、slice、channel、mapを反復処理する。arrayではインデックスと値を、mapではキーと値を返す
append append(slice,要素)でsliceに要素を追加する
// range構文の例、iはインデックス、valueは要素値
for i, value := range data {}

基本テンプレート

package main
import "fmt"
import "sort"
//import "math"
//import "strings"

func main(){
    var size, limit int
    fmt.Scanf("%d %d", &size, &limit)
    data := make([]int, size)
    for i := 0; i < size; i++{
        fmt.Scan(&data[i])
    }
    sort.Ints(data)
    
    result := 0
    fmt.Printf("%d", result)
}

func min(x, y int) int { if y < x { return y }; return x }
func max(x, y int) int { if y > x { return y }; return x }
func abs(x int) int { if x >= 0 { return x}; return -x }

1. 入出力(OJ向け)

fmtパッケージの公式ドキュメントには以下の4つの主要部分があります:

  • Constants(定数)
  • Variables(変数)
  • Functions(関数)
  • Types(型)

入出力にはfmtパッケージのインポートが必要です。

fmt.Scan(&count)
-----------------------------
var capacity, value [3]int
for i := 0; i < 3; i++ {
    fmt.Scanf("%d %d", &capacity[i], &value[i])
}
----------------------------------------
package main
import "fmt"
func main(){
    var num int
    var text string
    fmt.Scan(&num)
    fmt.Scan(&text)
    chars := []byte(text)
    fmt.Printf("%d\n", result)
}

func min(x, y int) int { if y < x { return y }; return x }
func max(x, y int) int { if y > x { return y }; return x }

2. 文字列操作

var chars = []byte("hello world")   // stringを文字配列に変換
var str = string(chars)             // 文字配列をStringに変換

Goではstringは不変(immutable)です。

可変文字列

JavaのStringBuilderに相当する機能はstrings.Builderを使用します。

var builder strings.Builder
builder.WriteString("start")  // 文字列を書き込む
builder.Len()                 // 文字列長を返す
builder.String()              // String型を返す
builder.WriteByte(c byte)     // 単一文字を書き込む

3. 配列(スライス)

配列とスライスの違い:

1) スライスは参照型、配列は値型
2) 配列の長さは固定、スライスは可変(動的配列)
3) スライスには配列にない属性がある:容量(cap)
4) スライスの基礎となるデータ構造は配列

配列の定義

var collection [3]int              // 要素数3のint型配列を定義

ソート機能

ソートには公式のsortパッケージを使用します。主な関数:

func Ints(x []int)                   // int型スライスを昇順ソート
func Float64s(x []float64)           // float64型スライスを昇順ソート
func Strings(x []string)             // string型スライスを昇順ソート
func Slice(x any, less func(i, j int) bool) // カスタム比較関数によるソート

カスタム構造体のソート

// 例:v属性に基づいてカスタム構造体をソート
type Item struct {
    name string
    value int
}
sort.Slice(items, func(i, j int) bool {
    return items[i].value < items[j].value
})

二次元スライスの定義

matrix := make([][]int, rows) 
for i := range matrix { 
    matrix[i] = make([]int, cols) 
}
----------------------------------------------
for i := 0; i < 3; i++

スライスのコピー

target := source[:]     // 浅いコピー、メモリを共有
========================================
destination := make([]type, len(source))
copy(destination, source) // 深いコピー
=========================================

4. mathパッケージ

定義されている主な定数:

MaxInt32  = 1<<31 - 1
MinInt32  = -1 << 31
MaxInt64  = 1<<63 - 1
MinInt64  = -1 << 63
</code>

5. mapの使用

dataMap := make(map[string]int, 100)      // keyがstring、valueがintのmapを定義
for key, val := range dataMap {}          // rangeキーワードでmapのkeyとvalueを反復処理
dataMap[key]++                            // valueを1増加させる

6. スライスを使用したグラフの隣接リスト

graph := make([][]int, vertexCount+1)
for i := 1; i <= vertexCount; i++ {
    graph[i] = make([]int, 0, 10)   // 0は実際の動的配列長、10は初期容量
}
graph[u] = append(graph[u], v)      // 動的配列に要素を追加

タグ: Go言語 オンラインジャッジ アルゴリズム プログラミング構文 データ構造

7月2日 18:47 投稿