字符串处理分数相减

592.分数加减运算

难度中等76

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

题解

主要的还是字符串处理有些麻烦,一些相关的API记不住,分子分母的计算方法可以直接采用数学的模拟来实现

  • 分数相加
    $$
    \frac{x_1 \times y_2 + x_2 \times y_1}{y_1 \times y_2}
    $$

  • 化简则是分子分母除以两者的公约数,公约数的计算可以使用辗转相除法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class Solution {
public String fractionAddition(String expression) {
long numerator = 0, denominator = 1;
int index = 0, n = expression.length();
while(index < n) {
long numerator1 = 0, sign = 1;
if (expression.charAt(index) == '-' || expression.charAt(index) == '+') {
sign = expression.charAt(index) == '-' ? -1 : 1;
index++;
}
while(index < n && Character.isDigit(expression.charAt(index))) {
numerator1 = numerator1 * 10 + expression.charAt(index) - '0';
index++;
}
numerator1 = sign * numerator1;
index++;

long denominator1 = 0;
while(index < n && Character.isDigit(expression.charAt(index))) {
denominator1 = denominator1 * 10 + expression.charAt(index) - '0';
index++;
}
numerator = denominator * numerator1 + denominator1 * numerator;
denominator *= denominator1;
}

if (numerator == 0)
return "0/1";
long g = gcd(Math.abs(numerator), denominator);
return Long.toString(numerator/g) + "/" + Long.toString(denominator/g);
}

public long gcd(long a, long b) {
long remainder = a % b;
while(remainder != 0) {
a = b;
b = remainder;
remainder = a % b;
}
return b;
}
}

  • 时间复杂度:$O(n + logC)$,其中 $n$ 是字符串 expression 的长度,$C$ 是化简前结果分子分母的最大值。求最大公约数需要 $O(logC)$
  • 空间复杂度:$O(1)$

image-20220727093059174


592.分数相减运算
http://example.com/2022/07/27/leetcode每日一题/592.分数相减运算/
作者
madao33
发布于
July 27, 2022
许可协议