Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

Given numerator = 1, denominator = 2, return "0.5". Given numerator = 2, denominator = 1, return "2". Given numerator = 2, denominator = 3, return "0.(6)".

Hint:

No scary math, just apply elementary math knowledge. Still remember how to perform a long division? Try a long division on 4/9, the repeating part is obvious. Now try 4/333. Do you see a pattern? Be wary of edge cases! List out as many test cases as you can think of and test your code thoroughly.

Solution

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if(numerator == 0) return "0";

        long numer = (long) numerator;
        long denom = (long) denominator;

        boolean negative = numer * denom < 0;
        numer = numer < 0 ? -numer : numer;
        denom = denom < 0 ? -denom : denom;

        StringBuilder sb = new StringBuilder();
        sb.append( numer / denom ) ;
        numer %= denom;
        if(numer != 0) sb.append(".");
        List<Long> remain = new ArrayList<Long>();
        List<Long> ans = new ArrayList<Long>();
        boolean cycle = false;
        int cycleIdx = -1;
        while(numer != 0) {
            if(remain.contains(numer)) {
                cycle = true;
                cycleIdx = remain.indexOf(numer);
                break;
            }
            remain.add(numer);
            numer *= 10;
            ans.add(numer/denom);
            numer %= denom;
        }

        if(cycle) {
            for(int i = 0; i < ans.size(); i++) {
                if(i == cycleIdx) sb.append("(");
                sb.append(ans.get(i));
            }
            sb.append(")");
        } else {
            for(long a: ans) sb.append(a);
        }

        return negative? "-"+sb.toString() : sb.toString();
    }
}

results matching ""

    No results matching ""