February 22, 2020

166. Fraction to Recurring Decimal

166. Fraction to Recurring Decimal

class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if (numerator == 0) {
            return "0";
        }
        StringBuilder sb = new StringBuilder();
        if ((numerator < 0) ^ (denominator < 0)) {
            sb.append("-");
        }
        // Convert to Long or else abs(-2147483648) overflows
        long numeratorL = Math.abs(Long.valueOf(numerator));
        long denominatorL = Math.abs(Long.valueOf(denominator));
        long quotient = numeratorL / denominatorL;
        sb.append(quotient);
        long remainder = numeratorL % denominatorL;
        if (remainder == 0) {
            return sb.toString();
        }
        sb.append(".");
        Map<Long, Integer> map = new HashMap<>();
        while (remainder != 0) {
            if (map.containsKey(remainder)) {
                sb.insert(map.get(remainder), "(");
                sb.append(")");
                break;
            }
            map.put(remainder, sb.length());
            remainder = remainder * 10;
            quotient = remainder / denominatorL;
            remainder = remainder % denominatorL;
            sb.append(quotient);
        }
        return sb.toString();
    }
}
comments powered by Disqus