友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
|
|
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

公众号的微信号是: jikerizhi。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
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]。
-
最终结果的分子与分母保证是 32 位整数范围内的有效整数。
思路分析
每次取一个分子分母和前一个分子分母相加。逐步进行,直到结尾。
-
一刷
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2026-03-28 19:36:17
*/
public String fractionAddition(String expression) {
// 起始数字
int num = 0, den = 1;
char symbol = '+';
int index = 0;
while (index < expression.length()) {
// 获取下一个分子分母
int div = expression.indexOf("/", index);
int nextNum = Integer.parseInt(expression.substring(index, div));
int nextDen = 0;
int end = div + 1;
while (end < expression.length()
&& Character.isDigit(expression.charAt(end))) {
nextDen = 10 * nextDen + (expression.charAt(end) - '0');
end++;
}
// 计算两个分子分母
int[] sum = add(num, den, symbol, nextNum, nextDen);
num = sum[0];
den = sum[1];
if (end < expression.length()) {
symbol = expression.charAt(end);
index = end + 1;
} else {
break;
}
}
return num + "/" + den;
}
private int[] add(int preNum, int preDen, char symbol, int nextNum, int nextDen) {
if (symbol == '-') {
nextNum = -nextNum;
}
int num = preDen == nextDen ? preNum + nextNum : preNum * nextDen + nextNum * preDen;
if (num == 0) {
return new int[]{0, 1};
}
int den = preDen == nextDen ? preDen : preDen * nextDen;
// 处理约数:最简单的解法,GCD 最大公约数
int max = Math.max(Math.abs(num), Math.abs(den));
int min = Math.min(Math.abs(num), Math.abs(den));
// 处理约数
int gcd = gcd(max, min);
return new int[]{num / gcd, den / gcd};
// 处理约数:更高效的解法
// int div = Math.min(Math.abs(num), Math.abs(den));
// if (num % div == 0 && den % div == 0) {
// return new int[]{num / div, den / div};
// }
// for (int i = (int) Math.sqrt(div); i > 1; i--) {
// if (num % i == 0 && den % i == 0) {
// num = num / i;
// den = den / i;
// }
// }
// return new int[]{num, den};
}
private int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}

