Python:Code Taka第2週2


Q.数値配列numsをパラメータとして渡す。数字のうち半数を超える(多数、半を超える)数字を返してください。

nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2

nums 배열의 길이는 무조건 2개 이상

理解問題:パラメータ配列の長さの半分を超える繰り返しの数値を返します。△問題には書いていないが、半数を超える数字は一つしかないと仮定する。


私の答え

def more_than_half(nums):
  c = int(len(nums) / 2) + 1
  for i in nums:
    if nums.count(i) >= c:
      return i
  • パラメータを入力した数字配列の長さを2で割った後、+1を行い、過半数の基準を形成する.
  • の複文を用いてcount法を用いて,各数字が配列中にどれだけ存在するかを探し出し,数字が半数を超えるとその数字を返す.
  • 今もう一度見ると、複文の中で同じ数字がカウントされていて、効率が高くありません.例えば、1という数字を何回繰り返して、1という数字を計算します.
    また,半数を超える数が複数あると仮定すると,上記の回答を繰り返すことはできない.
    次の答えは、1つの数字が道路の過半数を超えたと仮定した答えです.

    修正した答え

    def more_than_half(nums):
        majority = int(len(nums) / 2) + 1
        num = None
        
        for i in nums:
            if num == i:
                continue
                
            if nums.count(i) >= majority:
                return i
            else:
                num = i
        
        return num
    numという変数を宣言し、チェックした数字を保存すると、同じ演算が繰り返されません.[1,1,1,1,2,2,2]のような数字の配列があれば,1を一度チェックし,1と1をチェックしないでスキップすることができ,繰り返し文の回数を減らすことができる.

    ソリューション(Hashmapを使用)

    import collections
    
    def more_than_half(nums):
        counts = collections.Counter(nums)
        return max(counts.keys(), key=counts.get)

    ソリューション(ソートを使用)

    def more_than_half(nums):
        nums.sort()
        return nums[len(nums)//2]
    sortを使う答えはアイデアです.