题目
给定一个表示分数加减运算的字符串 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]。
思路
题目不难,直接模拟即可,就是太麻烦了
- 遍历,寻找每一个分数(边界情况需要考虑到)
- 将两分数拆分为分子分母然后求和,寻找两分母的最小公倍数作为和的分母,然后分子做相应的乘法变换,结合成字符串即可
题解
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_