166. Fraction to Recurring Decimal

package LeetCode_166

/**
 * 166. Fraction to Recurring Decimal
 * https://leetcode.com/problems/fraction-to-recurring-decimal/description/
 *
 * 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.

Example 1:
Input: numerator = 1, denominator = 2
Output: "0.5"

Example 2:
Input: numerator = 2, denominator = 1
Output: "2"

Example 3:
Input: numerator = 2, denominator = 3
Output: "0.(6)"
 * */
class Solution {
    fun fractionToDecimal(numerator: Int, denominator: Int): String {
        if (numerator == 0) {
            return "0"
        }
        if (denominator == 0) {
            return ""
        }
        val fractionSb = StringBuilder()
        //check if need add '-' in first
        if (numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0) {
            fractionSb.append("-")
        }
        val num = Math.abs(numerator.toLong())
        val den = Math.abs(denominator.toLong())
        var result = num / den
        fractionSb.append(result.toString())
        //get the remainder
        var remainder = num % den
        if (remainder == 0L) {
            //if divisible
            return fractionSb.toString()
        }
        fractionSb.append(".")
        //use map to help, key is remainder, value is result length
        val map = HashMap<Long, Int>()
        while (remainder != 0L) {
            val curString = fractionSb.toString()
            println(map)
            if (map.containsKey(remainder)) {
                val begin = map.get(remainder) ?: 0
                val part1 = curString.substring(0, begin)
                val part2 = curString.substring(begin, curString.length)
                return part1 + "(" + part2 + ")"
            }
            map.put(remainder, curString.length)
            //because we need to get every decimal, so *10 and do again
            remainder *= 10
            result = remainder / den
            fractionSb.append(result.toString())
            //continue to get the new remainder
            remainder %= den
        }
        return fractionSb.toString()
    }
}
原文地址:https://www.cnblogs.com/johnnyzhao/p/13296677.html