166. Fraction to Recurring Decimal
by Botao Xiao
Question
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)"
Thinking:
- Method:
    - 在计算小数时,如果出现了相同的被除数就会出现无限循环。
- 通过哈希表存储被除数,值是当前被除数出现的位置。
- 要考虑int的临界状况。
 
class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if(denominator == 0) return "NaN";
        Map<Long, Integer> map = new HashMap<>();
        StringBuilder sb = new StringBuilder();
        if(numerator > 0 && denominator < 0 || numerator < 0 && denominator > 0) sb.append('-');
        long aa = Math.abs((long)numerator);
        long bb = Math.abs((long)denominator);
        long digit = aa / bb;
        sb.append(digit);
        long remain = aa % bb;
        if(remain == 0) return sb.toString();
        sb.append(".");
        int count = 1;
        while(remain != 0 && !map.containsKey(remain *10)){
            remain *= 10;
            map.put(remain, count++);
            sb.append(Math.abs(remain / bb));
            remain %= bb;
        }
        if(remain != 0){
            sb.append(")");
            int val = map.get(remain * 10);
            String result = sb.toString();
            int index = result.indexOf('.');
            sb.insert(val + index, '(');
        }
        return sb.toString();
    }
}
二刷
- 注意int的上下限问题。
- 如何退出程序,返回结果:
    - 余数为0.
- 余数不为零,但是余数已经出现过了。这说明会出现循环小数。
        class Solution { public String fractionToDecimal(int numerator, int denominator) { if(denominator == 0) return "NaN"; Map<Long, Integer> map = new HashMap<>(); StringBuilder sb = new StringBuilder(); if(numerator > 0 && denominator < 0 || numerator < 0 && denominator > 0) sb.append('-'); long aa = Math.abs((long)numerator); long bb = Math.abs((long)denominator); long digit = aa / bb; sb.append(digit); long remain = aa % bb; if(remain == 0) return sb.toString(); sb.append("."); int count = 1; while(remain != 0 && !map.containsKey(remain *10)){ remain *= 10; map.put(remain, count++); sb.append(Math.abs(remain / bb)); remain %= bb; } if(remain != 0){ sb.append(")"); int val = map.get(remain * 10); String result = sb.toString(); int index = result.indexOf('.'); sb.insert(val + index, '('); } return sb.toString(); } }
 
Subscribe via RSS
