enkdsnnnnnnnn

めもるめもる

hackerrankでGoの文法をおさらいしている

A Very Big Sum
func aVeryBigSum(ar []int64) int64 {
    var sum int64
    for num := range ar {
        sum += num
    }
    return sum
}

-> range loopとでかい整数

  • 書き方に慣れない。。やっぱり手を動かさないとだめだ、、
a
func diagonalDifference(arr [][]int32) int32 {
    // Write your code here
    var primarydiagonal int32
    var secondarydiagonal int32
    for i := 0; i < 3; i++ {
        for j := 0; j < 3; j++ {
            if (i == 1 && j == 1) {
                primarydiagonal += arr[i][j]
                secondarydiagonal += arr[i][j]
            } else if (i == 0 && j == 0) || (i == 2 && j == 2){
                primarydiagonal += arr[i][j]
            } else if (i == 2 && j == 0) || (i == 0 && j == 2) {
                secondarydiagonal += arr[i][j]
            }
        }
    }
    resFloat64 := math.Abs((float64)(primarydiagonal - secondarydiagonal))
    res := int32(resFloat64)
    return res
}

-> 2次元配列、引数の型

  • サンプルケースのn=3の場合をナイーブに実装するとこうでO(n2)。ただ、必要なマスのindexの規則性がわかればO(N)でいける。
func diagonalDifference(arr [][]int32) int32 {
    // Write your code here
    var primarydiagonal int32
    var secondarydiagonal int32

    for i := 0; i < len(arr); i++ {
        primarydiagonal += arr[i][i]
        secondarydiagonal += arr[i][len(arr)-1-i]
    }
    
    resFloat64 := math.Abs(float64((primarydiagonal - secondarydiagonal)))
    res := int32(resFloat64)
    return res
}
Plus Minus
// Complete the plusMinus function below.
func plusMinus(arr []int32) {
    var posCnt float32 
    var negCnt float32
    var zeroCnt float32

    for _,  v := range arr {
        if v > 0 {
            posCnt++
        } else if v < 0 {
            negCnt++
        } else {
            zeroCnt++
        }
    }
    fmt.Println(posCnt / float32(len(arr)))
    fmt.Println(negCnt / float32(len(arr)))
    fmt.Println(zeroCnt / float32(len(arr)))
}

-> rangeの仕様

  • 変数を2つ定義する。1つ目はindex。2つ目は配列内の値。この辺もややこしい。
Staircase
// Complete the staircase function below.
func staircase(n int32) {
    step := int(n)
    for i := 1; i <= step; i++ {
        for j := 1; j <= step - i; j++ {
            fmt.Print(" ")
        }
        for k := 1; k <= i; k++ {
            fmt.Print("#")
        }
        fmt.Println("")
    }
}

-> 1-origin 2次元配列の出力