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: O(nlogab)O(nlogab), log ab -> 求 gcd 的 time, n 是多少個 “分數

S: O(n), 存幾個分數

avoid number overflow

Last updated

Was this helpful?