スタックと集計アルゴリズム応用【2020年Python実習職場-アルゴリズム問題】


一、スタック構造問題
  • 入力:1つの文字列、要素は小文字からなる
  • 出力:文字列内のすべての「b」と「ac」のアルファベットの組み合わせを除去する必要がある.すなわち、出力の結果に「b」と「ac」
  • が含まれない.
    スタックの採用:O(n)実装
  • 構想:listのpop()メソッドを使用して、末尾から各文字をポップアップし、フィルタされていない文字を新しいリストに追加します.ただし、b文字に遭遇した場合は次の文字をポップアップし続け、また‘c’に遭遇した場合は複数回ポップアップし、2回ポップアップした内容が‘ac’であるか否かを判断し、もしそうであればポップアップを継続する.
  • コードの内容は以下の通りである:
  • s1 = 'goodbye disen! back see you !'
    s1_list = list(s1)
    new_str = []
    
    while len(s1_list) > 0:
        c = s1_list.pop()
        if c == 'b':
            continue
        elif c == 'c':
            c2 = s1_list.pop() if len(s1_list) > 0 else ''
            if c2 != 'a':
                new_str.insert(0, c)
    
                if c2 != '':
                    new_str.insert(0, c2)
        else:
            new_str.insert(0, c)
    
    print(''.join(new_str))
    

    結果は次のとおりです.
    goodye disen!k see you !
    

    二、並べ替えと重み付け
  • 入力:正の整数からなる配列で、要素が増加し始め、
  • 減少するのが特徴です.
  • 出力:要求ソートと重量除去
  • 集計アルゴリズムの使用が必要
  • 構想:集計アルゴリズムは分治アルゴリズム思想の一種であり、その核心思想は1つの大きな配列を中間から左右の2つの配列を分割し、この2つの配列をそれぞれ分割し、配列が1つの要素しかないときに戻るまで順番に類推し、戻り配列に対して先が小さくて後が大きい順に1つを合併することである.
  • コードは次のとおりです:
  • def merge(arr_left, arr_right):
        c = []  #      
        i = j = 0
    
        #       
        while i < len(arr_left) and j < len(arr_right):
            if arr_left[i] < arr_right[j]:
                #     
                if arr_left[i] not in c:
                    c.append(arr_left[i])
                i += 1
            else:
                #     
                if arr_right[j] not in c:
                    c.append(arr_right[j])
                j += 1
    
        #           
        #          (    ),               
        #   ,            
        if i == len(arr_left):
            # c.extend(arr_right[j:])
            for k in arr_right[j:]:
                if k not in c:
                    c.append(k)
        else:
            # c.extend(arr_left[i:])
            for k in arr_left[i:]:
                if k not in c:
                    c.append(k)
    
        return c
    
    
    def merge_sorted(arr):
        if len(arr) <= 1:
            return arr
    
        middle = len(arr) // 2
        arr_left = merge_sorted(arr[:middle])
        arr_right = merge_sorted(arr[middle:])
    
        return merge(arr_left, arr_right)
    
    

    テストコードは次のとおりです.
    arr = [8, 2, 1, 4, 2, 8, 6, 1, 4, 5, 7]
    print(merge_sorted(arr))
    

    結果は次のとおりです.
    [1, 2, 4, 5, 6, 7, 8]