592. Fraction Addition and Subtraction
Find 最大共同分母
T: O(n)
S: O(幾個分數數字)
class Solution {
private record NumObj (int num, int deno){};
public String fractionAddition(String expression) {
List<NumObj> list = new ArrayList<>();
if (expression.charAt(0) != '-') {
expression = "+" + expression;
}
int sign = expression.charAt(0) == '+' ? 1 : -1;
int start = 1;
for (int i = 1; i < expression.length(); i++) {
if (expression.charAt(i) == '+' || expression.charAt(i) == '-') {
String[] numStr = expression.substring(start, i).split("/");
NumObj num = new NumObj(sign*Integer.parseInt(numStr[0]), Integer.parseInt(numStr[1]));
list.add(num);
start = i+1;
sign = expression.charAt(i) == '+' ? 1 : -1;
}
}
String[] numStr = expression.substring(start, expression.length()).split("/");
NumObj num = new NumObj(sign*Integer.parseInt(numStr[0]), Integer.parseInt(numStr[1]));
list.add(num);
int finalDeno = 1;
for (NumObj numObj : list) {
finalDeno *= numObj.deno;
}
int finalNum = 0;
for (NumObj numObj : list) {
finalNum += (finalDeno/numObj.deno)*numObj.num;
}
int gcd = gcd(Math.abs(finalNum), finalDeno);
finalNum = finalNum/gcd;
finalDeno = finalDeno/gcd;
return finalNum + "/" + finalDeno;
}
private int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a%b);
}
}
/**
2 6
6 2
2 0
-1 2
1 3
2
3
-3 2 = -1
-22/1233-
+1/3-1/2
*/Using LCM
T: , log ab -> 求 gcd 的 time, n 是多少個 “分數
S: O(n), 存幾個分數
avoid number overflow
Last updated
Was this helpful?