Fraction to Recurring Decimal

Fraction to Recurring Decimal

问题:

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.

思路:

  模拟除法

  判断循环节的时候用hashtable

我的代码:

import java.util.Hashtable;

public class Solution {

    public String fractionToDecimal(int numerator, int denominator) {

        if(denominator == 0 || numerator == 0 )    return "0";

        int cnt = 0;

        if(numerator < 0)

        {

            cnt++;

        }

        if(denominator < 0)

        {

            cnt++;

        }

        long num = Math.abs((long)numerator);

        long den = Math.abs((long)denominator);

        StringBuffer left = new StringBuffer();

        long remain = num%den;

        num /= den;

        left.append(num);

        if(remain == 0) 

        {

            return cnt == 1 ? "-"+left.toString() : left.toString();

        }

        StringBuffer right = new StringBuffer();

        Hashtable<Long,Integer> ht = new Hashtable<Long,Integer>();

        num = remain;

        ht.put(num, 0);

        int index = 1;

        while(num != 0)

        {

            num *= 10; 

            remain = num%den;

            num /= den;

            right.append(num);

            if(ht.containsKey(remain))

            {

                right.insert(ht.get(remain),"(");

                right.append(')');

                break;

            }

            ht.put(remain,index);

            num = remain;

            index++;

        }

        String rst = left.toString() + "." + right.toString();

        return cnt == 1 ? "-"+rst : rst;

    }

}
View Code

他人代码:

public class Solution {

    public String fractionToDecimal(int numerator, int denominator) {

        if (numerator == 0) {

            return "0";

        }

        StringBuilder res = new StringBuilder();

        // "+" or "-"

        res.append(((numerator > 0) ^ (denominator > 0)) ? "-" : "");

        long num = Math.abs((long)numerator);

        long den = Math.abs((long)denominator);



        // integral part

        res.append(num / den);

        num %= den;

        if (num == 0) {

            return res.toString();

        }



        // fractional part

        res.append(".");

        HashMap<Long, Integer> map = new HashMap<Long, Integer>();

        map.put(num, res.length());

        while (num != 0) {

            num *= 10;

            res.append(num / den);

            num %= den;

            if (map.containsKey(num)) {

                int index = map.get(num);

                res.insert(index, "(");

                res.append(")");

                break;

            }

            else {

                map.put(num, res.length());

            }

        }

        return res.toString();

    }

}
View Code

学习之处:

  • 这道题的思路很简单,看到题的那一刻基本上也知道怎么做了,但是需要考虑的corner case 特别多
    • 分母为0 分子为0
    • 永远记住对于int而言负数转换成正数的时候,需要用long进行存储,因为会溢出啊!!
    • 循环节问题 仔细分析 1/6 和 2/3 这两种情况就可以了
  • 判断乘积或者除法的正负号的时候,用这种方法真简洁 (numerator > 0) ^ (denominator > 0)) ? "-" : "

你可能感兴趣的:(action)