LeetCode每日一题——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”

提示:

输入和输出字符串只包含 ‘0’ 到 ‘9’ 的数字,以及 ‘/’, ‘+’ 和 ‘-’。
输入和输出分数格式均为 ±分子/分母。如果输入的第一个分数或者输出的分数是正数,则 ‘+’ 会被省略掉。
输入只包含合法的最简分数,每个分数的分子与分母的范围是 [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
输入的分数个数范围是 [1,10]。

思路

题目不难,直接模拟即可,就是太麻烦了

  1. 遍历,寻找每一个分数(边界情况需要考虑到)
  2. 将两分数拆分为分子分母然后求和,寻找两分母的最小公倍数作为和的分母,然后分子做相应的乘法变换,结合成字符串即可

题解

class Solution:
    def fractionAddition(self, expression: str) -> str:
        # 找最大公约数
        def getmax(index1, index2):
            while (index2 != 0):
                temp = index1 % index2
                index1 = index2
                index2 = temp
            return index1
        # 两数相加减
        def process(x, y, a, b):
            index1, index2 = y, b
            # 分母
            mu = y * b // getmax(index1,index2)
            # 分子
            zi = x * mu // y + a * mu // b
            # 结合后可能还存在最大公约数,可以约分的
            index = getmax(zi, mu)
            # 约分
            zi,mu = zi // index, mu // index
            # 返回字符串格式
            return str(zi) + '/' + str(mu)
        # 寻找每一个分数,并累加结果
        sum_, index = 0, 0
        for i in range(len(expression)):
            if i != 0 and (expression[i] == '-' or expression[i] == '+'):
                sum_, index = expression[:i], i
                break
        if index == 0:
            return expression
        if expression[index] == '-':
            index1, index2 = index, index + 1
        else:
            index1, index2 = index + 1, index + 1
        while index2 < len(expression):
            if expression[index2] != '-' and expression[index2] != '+':
                index2 += 1
            else:
                temp = expression[index1:index2]
                temp1 = list(map(int, sum_.split('/')))
                temp2 = list(map(int, temp.split('/')))
                x, y = temp1[0], temp1[1]
                a, b = temp2[0], temp2[1]
                sum_ = process(x, y, a, b)
                if expression[index2] == "-":
                    index1 = index2
                else:
                    index1 = index2 + 1
                index2 += 1
        temp = expression[index1:index2]
        temp1 = list(map(int, sum_.split('/')))
        temp2 = list(map(int, temp.split('/')))
        x, y = temp1[0], temp1[1]
        a, b = temp2[0], temp2[1]
        sum_ = process(x, y, a, b)
        return sum_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyk今天写算法了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值