[プログラマ]式の最大化


私が使ったシャベル
この问题は本当にたくさんのシャベルを使ったのです...まだあります.これは本当に長引く問題だ.
最初はBFSを使いたい、そして正規表現を使いたい...そしてだんだん山の方へ歩いていきました.とにかく!!!
問題を説明する+要求を確認する.
1.問題の解釈
与えられた4つの演算の個数は、*-+3種である.
3つの方法で作成できるすべての操作
指定された文字列を使用して演算する場合に発生する可能性のある最大値を求めます
2.要求
1)*、-、+3演算子->ここでは3!6種類しかないので、特に組み合わせを使う必要はありません.
2)与えられた文字列パターンに演算子順序を適用して優先的に解く
3.私のミス
1)作成しようとした関数は次のとおりです.
  • 3の演算子を使用して、すべての演算順序の関数を抽出します.
    ->作成する必要はありません.
  • 正規表現を使用して숫자 연산자 숫자モードを抽出して計算します!
    例外とは思わなかった.演算の後1-2-3のような状況が発生し、-1-3が残って処理できなくなった.
    ->パターン自体が存在しないまで計算するが,コードが長ければ長いほど,他の答えを見ても理解しにくい.
  • の下には私が解いた草があります.
  • def extract_order(order=""):
        if len(order) == 3:
            result.append(order)
            return
    
        if "+" not in order:
            extract_order(order + "+")
        if "-" not in order:
            extract_order(order + "-")
        if "*" not in order:
            extract_order(order + "*")
    
    def solution(expression):
        extract_order()
        max = -1111
        for i in result:
            temp = expression
            for j in i:
                if j == "-":
                    cal_pattern = re.compile("[0-9]+-[0-9]+")
                else:
                    cal_pattern = re.compile(f"[0-9]+[{j}][0-9]+")
                target_exe = cal_pattern.findall(temp)
                for k in target_exe:
                    temp = temp.replace(k, str(eval(k)))
    
            if not temp.isdigit():
                temp = str(eval(temp))
    
            if int(abs(int(temp)))>max:
                max = abs(int(temp))
    
        return max
    模範解答
    Kakao技術ブログを参照して、思ったより解説が簡単です.これは簡潔なコードだと思います.ブログをめくって、最も模範的な答えに近い答えを見つけた.
    import re
    
    def solution(expression):
        answer = 0
        oper = ["+-*", "+*-", "-*+", "-+*", "*+-", "*-+"] # 어차피 6가지 밖에 없기 때문에 미리 배열에 담아둔다.
        for i in range(6):
            check = re.findall("[+*-]+", expression)
            numbers = re.findall("[0-9]+", expression)
            # 정규표현식을 사용해 숫자와 연산자를 모두 분리한다.
            for j in range(3): # 연산자를 하나씩 꺼내어 비교한다.
                k = 0
                while k < len(check): # 문자열에서 추출된 연산자의 개수 만큼 비교한다.
                    if check[k] == oper[i][j]: # 여기서 oper[i][j]가 위의 oper배열에서 순서대로 하나씩 비교하는 것을 알 수 있음(연산자 순서가 보장됨)
                        numbers[k] = str(eval(numbers[k] + check[k] + numbers[k + 1])) # 여기서,, 1+2 라고 하면 연산자와 피연산자의 인덱스 는 같거나 1차이라는 특징을 이용했다. 정말 완벽한 풀이!
                        del check[k] #이후, 연산된 결과를 제외시켜준다.
                        del numbers[k + 1] # 피연산자는 numbers[k]로만들어준다. 나머지는 삭제
                    else:
                        k += 1 # 순서와 맞지않으면 다음 연산자를 확인하는 방식이다.
            answer = max(answer, abs(int(numbers[0])))
        return answer
    完璧すぎます.この問題を注釈で説明した.
    会わないと散らない
    見ずに解いたあげく、二つの間違いを犯した.
    import re
    
    result = []
    def extract_order(order=""): # 이거는 bfs연습겸 그냥 했다.
        if len(order) == 3:
            result.append(order)
            return
    
        if "+" not in order:
            extract_order(order + "+")
        if "-" not in order:
            extract_order(order + "-")
        if "*" not in order:
            extract_order(order + "*")
    
    def solution(expression):
        extract_order()
        oper = result
        answer = -111
        for i in range(6):
            check = re.findall("[*+-]+",expression)
            numbers = re.findall("[0-9]+",expression)
            k = 0
            temp = 0
            for j in range(3):
                while k <len(check):
                    if check[k] == oper[i][j]:
                        numbers[k]=str(eval(numbers[k]+check[k]+numbers[k+1]))
                        del numbers[k+1]
                        del check[k]
                    else:
                        k+=1
            temp = abs(int(numbers[0]))
            
            if answer< temp:
                answer = temp
                
        return answer
    ドアでkを初期化するには、なぜ下で...そしてnumbersは最後に「要素」という形を考えるべきだ.とりあえず今日のポスターは終わり