분수 덧셈과 뺄셈

2259 단어 theabbieleetcodedsa
분수 덧셈과 뺄셈의 표현을 나타내는 문자열expression이 주어지면 계산 결과를 문자열 형식으로 반환합니다.

최종 결과는 irreducible fraction 이어야 합니다. 최종 결과가 정수인 경우 분모가 있는 분수 형식으로 변경합니다1. 따라서 이 경우 22/1로 변환되어야 합니다.

예 1:

입력: 식 = "-1/2+1/2"
출력: "0/1"

예 2:

입력: 식 = "-1/2+1/2+1/3"
출력: "1/3"

예 3:

입력: 식 = "1/3-1/2"
출력: "-1/6"

제약:
  • 입력 문자열에는 '0' ~ '9' , '/' , '+''-' 만 포함됩니다. 출력도 마찬가지입니다.
  • 각 분수(입력 및 출력)의 형식은 ±numerator/denominator 입니다. 첫 번째 입력 분수 또는 출력이 양수이면 '+'가 생략됩니다.
  • 입력에는 유효한 기약 분수만 포함되며 각 분수의 분자와 분모는 항상 [1, 10] 범위에 있습니다. 분모가 1 이면 이 분수가 실제로 위에서 정의한 분수 형식의 정수임을 의미합니다.
  • 주어진 분수의 수는 [1, 10] 범위에 있습니다.
  • 최종 결과의 분자와 분모가 유효하고 32비트 int 범위에 있음이 보장됩니다.

  • 해결책:

    class Solution:
        def gcd(self, a, b):
            while b:
                a, b = b, a % b
            return a
    
        def lcm(self, arr):
            n = len(arr)
            curr = arr[0]
            for i in range(1, n):
                l = arr[i]
                curr = (curr * l) // self.gcd(curr, l)
            return curr
    
        def fractionAddition(self, expression: str) -> str:
            expression += "x"
            sign = 1
            chunk = ""
            nums = []
            for c in expression:
                if c == "+" or c == "-" or c == "x":
                    if len(chunk) > 0:
                        a, b = chunk.split("/")
                        a, b = int(a), int(b)
                        nums.append([sign * a, b])
                    chunk = ""
                    if c == "+":
                        sign = 1
                    elif c == "-":
                        sign = -1
                else:
                    chunk += c
            mul = self.lcm([num[1] for num in nums])
            ans = sum([num[0] * mul // num[1] for num in nums])
            hcf = self.gcd(ans, mul)
            return "{}/{}".format(ans // hcf, mul // hcf)
    

    좋은 웹페이지 즐겨찾기