PermMissingElem,FrogJmp,apeEquilibrium

の答えです。

なんか、問題文載せるのめんどくさくなってきたので答えだけです。

 

1、PermMissingElem

 

問題文には特に書いていませんが、N=0もありなので、空の配列が入った場合も考える必要があって、そこで引っかかりました。

空の配列といった例外的な要素ももれなく考えることが高得点への道みたいですね。

まぁ、最初にif文で例外として除けばいいみたいです。

def solution(A):
    if A == []:
        return 1
    A.sort()
    n_A = len(A)
    if n_A == 1:
        return (abs(3-A[0]))
    elif A[0] != 1:
        return 1
    for i in range (n_A-1):
        if A[i] != (A[i+1] - 1):
            return (A[i]+1)
        elif i+2 == n_A:
            return (A[i+1]+1)

 

前回学んだsortを使いました。あとは1,2,3って並んでいるかチェックするだけ。

For文を多用するとTIMEOUTになってPerfomanceの項目が減点されるし、全体の得点も下がります。

なんか10行ぐらいで100点取れるみたいですが、こっちでも100点取れるのでよしとします。

 

 

2、FrogJmp

 

カエル、ぴょこぴょこ、3ぴょこぴょこ。

カエルって・・・。なんか、いきなり物語形式の文章題になりました。しかも、小学生レベルの計算。

余裕と思ったら割り切れた場合を考えるのを忘れました。

def solution(X, Y, D):
    # write your code in Python 3.6
    surplus = 0
    if (Y - X) % D != 0:
        surplus = 1
    return int((Y - X) / D) + surplus

 

 

3、TapeEquilibrium

 

今度は配列をどこできれば、切ってできた二つの配列の合計値の差が最小になるかって問題。

def solution(A):
    # write your code in Python 3.6
    Min =10000000000
    n_A = len(A)
    for i in range(1,n_A):
        a = 0
        b = 0
        for l in range(i):
            a += A[l]
        for l in range(i,n_A):
            b += A[l]
        c = abs(a-b)
        if c < Min:
            Min = c

    return Min

 

これだと53点になります。

わかってたけど時間かかりすぎだそうです。

やっぱり、網羅的にやる方法はよくないのか・・・

真ん中から調べていって、差が減らなくなったら終わりというのも試しましたが、正しい切る位置が端っこにある場合はうまくいきませんでした。

で検索で一番最初に出てきたのがこれ

def solution(A):
    # write your code in Python 3.6
    head = A[0]
    tail = sum(A[1:])
    min_dif = abs(head - tail)
    for index in range(1, len(A)-1):
        head += A[index]
        tail -= A[index]
        if abs(head-tail) < min_dif:
            min_dif = abs(head-tail)
    return min_dif

 

なるほどーーって感じです。

やっぱりfor文を使う回数を最小にするのがコツみたいですね。

勉強になります。普段から気をつけよっと。

 

 

もっとやろうと思ったけど今日は疲れたのでここまでです。

それでは。