Medium
Given a string expression
representing an expression of fraction addition and subtraction, return the calculation result in string format.
The final result should be an irreducible fraction. If your final result is an integer, change it to the format of a fraction that has a denominator 1
. So in this case, 2
should be converted to 2/1
.
Example 1:
Input: expression = “-1/2+1/2”
Output: “0/1”
Example 2:
Input: expression = “-1/2+1/2+1/3”
Output: “1/3”
Example 3:
Input: expression = “1/3-1/2”
Output: “-1/6”
Constraints:
'0'
to '9'
, '/'
, '+'
and '-'
. So does the output.±numerator/denominator
. If the first input fraction or the output is positive, then '+'
will be omitted.[1, 10]
. If the denominator is 1
, it means this fraction is actually an integer in a fraction format defined above.[1, 10]
.import java.util.ArrayList;
import java.util.List;
public class Solution {
private int gcd(int a, int b) {
return a % b == 0 ? b : gcd(b, a % b);
}
private String format(int a, int b) {
int gcd = Math.abs(gcd(a, b));
return a / gcd + "/" + (b / gcd);
}
private int[] parse(String s) {
int idx = s.indexOf("/");
return new int[] {
Integer.parseInt(s.substring(0, idx)), Integer.parseInt(s.substring(idx + 1))
};
}
public String fractionAddition(String expression) {
int[] rst = {0, 1};
List<int[]> list = new ArrayList<>();
StringBuilder sb = new StringBuilder().append(expression.charAt(0));
for (int i = 1; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '+' || c == '-') {
list.add(parse(sb.toString()));
sb = new StringBuilder().append(c);
} else {
sb.append(c);
}
}
list.add(parse(sb.toString()));
for (int[] num : list) {
rst = new int[] {rst[0] * num[1] + rst[1] * num[0], rst[1] * num[1]};
}
return format(rst[0], rst[1]);
}
}