【Leetcode】166. Fraction to Recurring Decimal

题目地址:

https://leetcode.com/problems/fraction-to-recurring-decimal/

给定两个整数 x x x y y y,求其商,以小数形式表示。循环节要用括号括起来。

思路是先确定正负号,然后求 ∣ x / y ∣ |x/y| x/y。不妨设 x > 0 , y > 0 x>0,y>0 x>0,y>0。可以先求整数部分,如果没有余数,则直接返回整数部分;否则小数部分就等于 ( x m o d    y ) / y (x\mod y)/y (xmody)/y。按照手工除法的方法,每次会将当前数乘以 10 10 10再除以 y y y作为当前位的结果,然后当前数模 y y y继续进行下一位的计算。如果某一次发现当前余数是之前出现过的,那么就确定了出循环节的出现。为此,我们开一个HashMap,key存余数,value存计算到哪里得到了key这个余数。代码如下:

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

public class Solution {
    
    
    public String fractionToDecimal(int x, int y) {
    
    
        StringBuilder sb = new StringBuilder();
        if (x < 0 && y > 0 || x > 0 && y < 0) {
    
    
            sb.append('-');
        }
        
        long n = Math.abs((long) x), d = Math.abs((long) y);
        sb.append(n / d);
        n %= d;
        if (n == 0) {
    
    
            return sb.toString();
        }
        
        sb.append('.');
        Map<Long, Integer> map = new HashMap<>();
        // 当然余数为0了就意味着没有余数,能除尽,则直接出循环
        while (n != 0 && !map.containsKey(n)) {
    
    
            map.put(n, sb.length());
            sb.append(n * 10 / d);
            n = n * 10 % d;
        }
        
        if (n != 0) {
    
    
            sb.insert(map.get(n), "(");
            sb.append(')');
        }
        
        return sb.toString();
    }
}

时空复杂度取决于 x / y x/y x/y的具体值和循环节的长度。

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/121073283