acokikoy's notes

{"勉強中":"Python","注目":"Shopify","LOVE♡":["ABARTH595","TA-GG9","Ukulele","Movable Type","ガーナ ミルクチョコレート"]} なWebディレクター

毎朝Codewars@2019.08.18(日): Square(n) Sum

毎朝ちびちびCodewars。 [6 kyu] Find The Parity OutlierFind The Parity Outlier www.codewars.com

今日のお題:

"""[6 kyu] Find The Parity OutlierFind The Parity Outlier
https://www.codewars.com/kata/find-the-parity-outlier/train/python

要素数3以上の整数からなるリストが与えられる。
リストの要素は、ただ1つを除いて全部偶数か、全部奇数のいずれかである。仲間はずれのその要素を返す関数を書け。

例:
[2, 4, 0, 100, 4, 11, 2602, 36]
-> 11 (全部偶数で これだけ奇数)

[160, 3, 1719, 19, 11, 13, -21]
-> 160 (全部奇数で これだけ偶数)
"""

コード(自分が書いたコード)

def find_outlier(integers):
    even, odd = [], []
    for i in integers:
        if i % 2 == 0: # even
            even.append(i)
        else: # odd
            odd.append(i)

        if len(even) > 1 and len(odd) == 1:
            return odd[0]
        if len(odd) > 1 and len(even) == 1:
            return even[0]

全て偶数奇数に仕分けてから最後に1回だけ判定する方法もある(下記、他の人のコード) 一要素仕分ける度に判定する方が、リストが大きい場合の計算量が小さくなるかと思って上記のようにしたが、 後から計算してみたらどちらの方法でも平均計算量は同程度かむしろ遅いぐらいだった。がっくり。

コード(他の人の書いたコード)

def find_outlier(int):
    odds = [x for x in int if x%2!=0]
    evens= [x for x in int if x%2==0]
    return odds[0] if len(odds)<len(evens) else evens[0]