TIL 35. CodeKata-Python第2週コメント


1.アルファベットを数字に変換


1-1. 質問する


パラメータとして1~3999のアルファベットsを使用する場合は、対応する数値を返します.
ローマ数字を数字としてマークします.
SymbolValueI1V5X10L50C100D500M1000
ローマ字を数字で読む方法は、左からローマ字を順番に付けます.
III = 3
XII = 12
XXVII = 27
でも4と9を表すときは後ろの数字から前の数字を外すといいです
4はIIIではなくIVです.
9はIXです.
I는 V, X 앞에 와서 4, 9
X는 L, C 앞에 와서 40, 90
C는 D, M 앞에 와서 400, 900

1-2. に答える

def roman_to_num(s):
  symbols = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
  value = [1, 5, 10, 50, 100, 500, 1000]
  result = 0

  for i in range(len(symbols)):
    result += s.count(symbols[i]) * value[i]

    if i % 2 == 0 and i < 6:
      result -= s.count(symbols[i] + symbols[i+1]) * value[i] * 2
      result -= s.count(symbols[i] + symbols[i+2]) * value[i] * 2

  return result

  • 同じインデックスを使用するために、シンボルと値を別々に並べます.

  • 各シンボル要素の個数に対応する値を乗算し、値を加算します.

  • 4と9を表す場合を除く.
    ->もしIXC先着(M除く)
    ->次の字や次の字と直接つながっていると
    ->valueに2を掛けて減算します.(本来はvalue値を減算するだけでしたが、結果値にvalueが加算されました)
  • 2.配列の半数を超える数値の検索


    2-1. 質問する


    数値配列numsをパラメータとして渡します.
    数字のうち半数を超える(多数、半を超える)数字を返してください.
    たとえば、
    nums = [3,2,3]
    return 3
    
    nums = [2,2,1,1,1,2,2]
    return 2
    アレイの長さが2より大きいと仮定します.

    2-2. に答える

    def more_than_half(nums):
      set_nums = set(nums)
      current = 0
    
      for num in set_nums:
        if current < nums.count(num):
          current = nums.count(num)
          result = num
    
    # 과반수가 되지 않는 경우 예외처리
      if current =< len(nums)/2:
        return print("과반수가 안된다")
    
      return result
  • 個数が最も多い要素を見つけて返却する.

  • どのようなタイプの要素があるかを知るために、numssetタイプに変更します.

  • 各固有要素がnums配列のうちどれだけあるかを決定し、currentに組み込む.

  • 要素個数がcurrentより大きい場合は、再度current更新する.

  • 最大個数を持つ要素は更新されないcurrent要素が返されます.
  • 一部の要素の個数が最大でも半数を超えないように例外処理を追加しました.
    過半数になるには、要素の個数が半分以上でなければならず、半分以下であれば認めない.

    3. 🤯かっこが有効かどうかを確認


    3-1. 質問する


    sは、複数の括弧からなるStringパラメータである.true/false、sが有効かどうかを返してください.
    「(」、「)」、「[」、「]」、「{」、「}」の6種類があります.
    カッコが開始された場合は、同じカッコで終了し、カッコの順序が正しい必要があります.
    s = "()"
    return true
    
    s = "()[]{}"
    return true
    
    s = "(]"
    return false
    
    s = "([)]"
    return false
    
    s = "{[]}"
    return true

    3-2. に答える

    def is_valid(string):
    
      finish = [')', ']', '}']
    
      if len(string) % 2 == 1 or (string[0] in finish):
        return False
    
      for i in range(0,len(string)-1,2):
        if string[i]==string[i+1]:
          return True
        else:
          return False
    

  • 番号全体が奇数の場合、または最初の要素が括弧で囲まれている場合は、Falseを返して例外処理を行います.

  • 0番のインデックスから2グリッドを移動し、次の要素と同じ値かどうかを比較します.

  • テストは合格しましたが、例外を考えてみましょう.

  • もしドアの中のifドアが本当なら、私たちは何とかして続けます.
    わたしは本当のことを言っただけだから,ほかに方法があるに違いない.
  • 4.配列によく現れる数字を返します


    4-1. 質問する


    numsは数字からなる配列です.
    よくある順番に数字をk個返す
    nums = [1,1,1,2,2,3],
    k = 2
    return [1,2]
    
    nums = [1]
    k = 1
    return [1]

    4-2. に答える

    def top_k(nums, k):
      nums_set  = set(nums)
      nums_list = []
      result    = []
    
      for num in nums_set:
        nums_list.append((num, nums.count(num)))
    
      nums_list.sort(key=lambda x: x[1], reverse=True)
    
      for i in range(k):
        result.append(nums_list[i][0])
    
      return result
    
    # sort 내부의 람다 함수
    # def sort_second(x):
    #   return x[1]

  • 要素や要素の登場回数をディック・シャナリとして記録したいのですが、並べ替えができないという問題もあります.

  • dickshernerの代わりにtupleを用いて並べ替え,sort(key=func)rotupleにより,tuple内部に近づいて並べ替えることができる.

  • 固有の要素のみを探すため、配列をsetに変更します.
  • nums_list配列に含まれる(요소, 요소 등장 횟수)トフ.
  • sort()方法、各図例において降順で並べ替え요소 등장 횟수>Ramda式の使用
  • k番号に従い、各tupleの요소resultに並べます.
  • 5.図形の最大面積を求める


    5-1. 質問する


    パラメータheightは数値からなる配列です.グラフィックで表すと、y軸の値であり、高さの値があります.
    [1,8,6,2,5,4,8,3,7]を下図に示します.
    サンプル写真
    そのグラフに水があるとき、水を入れることができる最大面積の値を返してください.
    アレイの長さが2より大きいと仮定します.

    5-2. に答える

    def get_max_area(height):
      area = []
      
      for i in range(len(height)):
        for j in range(i+1,len(height)):    
          this_area = (j-i) * min(height[i],height[j])
          area.append(this_area)
          
      return max(area)
  • 面積=横(2要素のインデックス差)*縦(2要素の値)

  • 重複を避けるために、面積を求めるために2つの要素を選択します.

  • インデックスに準じてj無条件に比べるi後なので横値はj-iです.

  • 2つの要素の値のうち、1つの小さな値が縦の値になります.

  • すべての場合の面積値は配列に含まれます.

  • 配列の最大値を返します.