分数加减运算
难度:
标签:
题目描述
代码结果
运行时间: 28 ms, 内存: 16.1 MB
/*
思路:
1. 解析输入字符串,将每个分数解析出来。
2. 使用Java Stream进行分数加法计算。
3. 计算结果的分子和分母,并将结果转换为最简分数。
4. 如果结果为整数,则将其转换为分数形式(分母为1)。
*/
import java.util.*;
import java.util.stream.*;
public class FractionAdditionStream {
public String fractionAddition(String expression) {
List<int[]> fractions = new ArrayList<>();
int index = 0, n = expression.length();
while (index < n) {
int sign = 1;
if (expression.charAt(index) == '-') {
sign = -1;
index++;
} else if (expression.charAt(index) == '+') {
index++;
}
int numerator = 0;
while (index < n && Character.isDigit(expression.charAt(index))) {
numerator = numerator * 10 + (expression.charAt(index) - '0');
index++;
}
numerator *= sign;
index++; // skip '/'
int denominator = 0;
while (index < n && Character.isDigit(expression.charAt(index))) {
denominator = denominator * 10 + (expression.charAt(index) - '0');
index++;
}
fractions.add(new int[]{numerator, denominator});
}
int[] result = fractions.stream()
.reduce(new int[]{0, 1}, (a, b) -> addFractions(a[0], a[1], b[0], b[1]));
return result[0] + "/" + result[1];
}
private int[] addFractions(int num1, int denom1, int num2, int denom2) {
int lcm = lcm(denom1, denom2);
int numerator = num1 * (lcm / denom1) + num2 * (lcm / denom2);
int gcd = gcd(Math.abs(numerator), lcm);
return new int[]{numerator / gcd, lcm / gcd};
}
private int lcm(int a, int b) {
return a * (b / gcd(a, b));
}
private int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
}
解释
方法:
这个题解的思路是模拟分数加减运算的过程。首先定义了求最大公约数(gcd)和最小公倍数(lcm)的函数。然后定义了分数加法函数add,根据两个分数的分母是否相同来进行不同的处理。接着遍历给定的表达式,用一个临时变量 tmp 来记录当前处理的数字。遇到 '+' 或 '-' 时,根据前面的符号对当前分数进行加减运算,并更新符号。遇到 '/' 时,将当前数字作为分子,并切换到分母。最后,将表达式中最后一个分数也加入计算,并对结果进行约分。
时间复杂度:
O(nlogM),其中 n 是表达式的长度,M 是分母的最大值。
空间复杂度:
O(1)
代码细节讲解
🦆
在处理分数时,为什么选择使用列表`[numerator, denominator]`表示分数,而不是创建一个分数类或使用其他数据结构?
▷🦆
在解析表达式并构建分数时,代码是如何确保每次遇到运算符时正确处理之前的数字和运算符的?
▷🦆
函数`add`在处理不同分母的分数时使用了最小公倍数(lcm)。这个方法是否总是有效,即是否有可能导致整数溢出或在某些编程语言中处理大数字时遇到性能瓶颈?
▷🦆
在代码中,如何处理表达式开头是负号的情况,比如`-1/2+1/2`,是如何初始化`sign`和`num`以确保第一个分数正确解析的?
▷相关问题
求解方程
求解一个给定的方程,将x
以字符串 "x=#value"
的形式返回。该方程仅包含 '+'
, '-'
操作,变量 x
和其对应系数。
如果方程没有解或存在的解不为整数,请返回 "No solution"
。如果方程有无限解,则返回 “Infinite solutions”
。
题目保证,如果方程中只有一个解,则 'x' 的值是一个整数。
示例 1:
输入: equation = "x+5-3+x=6+x-2" 输出: "x=2"
示例 2:
输入: equation = "x=x" 输出: "Infinite solutions"
示例 3:
输入: equation = "2x=x" 输出: "x=0"
提示:
3 <= equation.length <= 1000
equation
只有一个'='
.- 方程由绝对值在
[0, 100]
范围内且无任何前导零的整数和变量'x'
组成。