592. 分数加减运算(中)

题目

  • 给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。

    这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。

示例 1:

输入: expression = "-1/2+1/2"
输出: "0/1"

示例 2:

输入: expression = "-1/2+1/2+1/3"
输出: "1/3"

示例 3:

输入: expression = "1/3-1/2"
输出: "-1/6"

题解:模拟

class Solution:
    def fractionAddition(self, expression: str) -> str:
        # 返回结果也需要是分数 只能进行分数运算
        i = 0
        n1, d1 = 0, 1
        while i<len(expression):
            # 读取符号
            i, sign = self.read_sign(i, expression)
            # 读取分子 
            i, n2 = self.read_number(i, expression)
            # 跳过‘/‘
            i+=1
            # 读取分母
            i, d2 = self.read_number(i, expression)
            # 计算 n1/d1 和 n2/d2 的结果; 要同时赋值
            d1, n1 = d1*d2, n1*d2+sign*d1*n2
        # 如果结果为零 分母=1, 否则约分
        if n1==0: 
            d1=1
        else:
            divisor = gcd(n1, d1)
            n1 = n1//divisor
            d1 = d1//divisor
        return str(n1)+'/'+str(d1)  

    def read_sign(self, i, expression):# 读取符号
        sign = -1 if expression[i]=='-' else 1
        if expression[i]=='-' or expression[i]=='+': 
            i+=1#读完符号后移动指针
        return i, sign
    def read_number(self, i, expression):# 读取分子/分母
        num = 0
        while i<len(expression) and expression[i].isdigit():
            num = num*10+int(expression[i])#读取的数有可能超过一位数
            i += 1
        return i, num
    def gcd(self, a, b):
        """辗转相除法找a和b的公因数"""
        while a%b:
            a, b = b, a%b
        return b
posted @ 2024-04-09 10:21  Frommoon  阅读(6)  评论(0编辑  收藏  举报