题目:592. Fraction Addition and Subtraction(https://leetcode.com/problems/fraction-addition-and-subtraction/description/)
解法:首先对字符串进行拆分,组成一个个分数,然后分数通分相加,最后约分。
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
public String fractionAddition(String expression) {
List<Fractional> fList = buildFractionalList(expression);
Fractional added = add(fList);
Fractional result = reduction(added);
return result.toString();
}
public List<Fractional> buildFractionalList(String expression){
List<Fractional> list = new ArrayList<>();
Pattern pattern = Pattern.compile("([\\+\\-])?\\d+/\\d+");
Matcher matcher = pattern.matcher(expression);
while (matcher.find()) {
boolean plus = true;
String current = matcher.group();
if (current.contains("-")) {
plus = false;
current = current.replace("-", "");
} else {
current = current.replace("+", "");
}
String[] elems = current.split("/");
if (plus) {
list.add(new Fractional(Integer.parseInt(elems[0]),
Integer.parseInt(elems[1])));
} else {
list.add(new Fractional(Integer.parseInt(elems[0]) * -1,
Integer.parseInt(elems[1])));
}
}
return list;
}
public Fractional add(List<Fractional> list) {
Optional<Fractional> result = list
.stream()
.reduce((f1, f2) -> {
Fractional f = new Fractional();
f.numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator;
f.denominator = f1.denominator * f2.denominator;
return f;
});
return result.get();
}
public Fractional reduction(Fractional f) {
if (f.numerator == 0) {
return new Fractional(0, 1);
}
boolean negative = false;
if (f.numerator < 0) {
negative = true;
f.numerator = 0 - f.numerator;
}
int m = f.denominator;
int n = f.numerator;
int k = m % n;
while (k != 0) {
m = n;
n = k;
k = m % n;
}
f.denominator = f.denominator / n;
f.numerator = negative ? 0 - f.numerator / n : f.numerator / n;
return f;
}
public static class Fractional {
public int numerator;
public int denominator;
public Fractional(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
public Fractional() {
}
public String toString() {
return "" + numerator + "/" + denominator;
}
}
}