g0101_0200.s0166_fraction_to_recurring_decimal.Solution Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of leetcode-in-java21 Show documentation
Show all versions of leetcode-in-java21 Show documentation
Java-based LeetCode algorithm problem solutions, regularly updated
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