All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0101_0200.s0166_fraction_to_recurring_decimal.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0101_0200.s0166_fraction_to_recurring_decimal;

// #Medium #Top_Interview_Questions #String #Hash_Table #Math
// #2022_06_25_Time_3_ms_(55.19%)_Space_41.8_MB_(35.85%)

import java.util.HashMap;
import java.util.Map;

/**
 * 166 - Fraction to Recurring Decimal\.
 *
 * Medium
 *
 * 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.
 *
 * If multiple answers are possible, return **any of them**.
 *
 * It is **guaranteed** that the length of the answer string is less than 104 for all the given inputs.
 *
 * **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)" 
 *
 * **Example 4:**
 *
 * **Input:** numerator = 4, denominator = 333
 *
 * **Output:** "0.(012)" 
 *
 * **Example 5:**
 *
 * **Input:** numerator = 1, denominator = 5
 *
 * **Output:** "0.2" 
 *
 * **Constraints:**
 *
 * *   -231 <= numerator, denominator <= 231 - 1
 * *   `denominator != 0`
**/
@SuppressWarnings("java:S2153")
public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if (numerator == 0) {
            return "0";
        }
        StringBuilder sb = new StringBuilder();
        // negative case
        if (numerator > 0 && denominator < 0 || numerator < 0 && denominator > 0) {
            sb.append("-");
        }
        long x = Math.abs(Long.valueOf(numerator));
        long y = Math.abs(Long.valueOf(denominator));
        sb.append(x / y);
        long remainder = x % y;
        if (remainder == 0) {
            return sb.toString();
        }
        // decimal case
        sb.append(".");
        // store the remainder in a Hashmap because in the case of recurring decimal, the remainder
        // repeats as dividend.
        Map map = new HashMap<>();
        while (remainder != 0) {
            if (map.containsKey(remainder)) {
                sb.insert(map.get(remainder), "(");
                sb.append(")");
                break;
            }
            // store the remainder and the index of it's occurence in the String
            map.put(remainder, sb.length());
            remainder *= 10;
            sb.append(remainder / y);
            remainder %= y;
        }
        return sb.toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy