Leetcode - Fraction to Recurring Decimal

My code:

import java.util.HashMap;

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if (denominator == 0)
            return null;
        else if (numerator == 0)
            return String.valueOf(0);
        long num = (long) numerator;
        long den = (long) denominator;
        String ans = "";
        if ((num < 0) ^ (den < 0))
            ans += "-";
        num = Math.abs(num);
        den = Math.abs(den);
        long res = num / den;
        long rem = num % den;
        ans = ans + String.valueOf(res);
        if (rem == 0)
            return ans;
        ans += ".";
        HashMap remains = new HashMap();
        rem = rem * 10;
        while (rem != 0) {
            if (remains.containsKey(rem)) {
                int begin = remains.get(rem);
                String rpt = ans.substring(begin, ans.length());
                ans = ans.substring(0, begin);
                ans += "(" + rpt + ")";
                break;
            }
            remains.put(rem, ans.length());
            ans += String.valueOf(rem / den);
            rem = (rem % den) * 10;
        }
        return ans;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        System.out.println(test.fractionToDecimal(1, 90));
    }
}

What' a fuck!
这道题目是真的麻烦。首先一个难点在于。
如果判断一个小数是否会出现循环情况。我一开始打算用字符串+哈希表判断的。后来发现这是不对的。
这道题木相当于人工写了一个除法器。挺有意思。但是因为我没吃早饭。后期越写越饿。
实在扛不住了,就看了答案。
当余数出现重复时,就出现循环了。
这才开始。
还有考虑余数*10继续不够,该怎么办。只不过也是我考虑的过多了,才写不出来。
这道题木corner case挺多的。
而且我是到后期才意识到,得用hash map
key -> 余数
value -> 该余数对应的除数的下一位index

推荐一个博客,http://blog.csdn.net/ljiabin/article/details/42025037
饿死了。实在写不动了。

**
总结:
Hashmap, Math
**

Anyway, Good luck, Richardo!

My code:

import java.util.HashMap;

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        StringBuilder sb = new StringBuilder();
        String sign = (numerator < 0 == denominator < 0 || numerator == 0 ? "" : "-");
        sb.append(sign);
        long num = Math.abs((long) numerator);
        long div = Math.abs((long) denominator);
        sb.append(num / div);
        long remainder = num % div;
        if (remainder == 0) {
            return sb.toString();
        }
        sb.append(".");
        HashMap map = new HashMap();
        while (!map.containsKey(remainder)) {
            map.put(remainder, sb.length());
            sb.append(10 * remainder / div);
            remainder = 10 * remainder % div;
        }
        
        int index = map.get(remainder);
        sb.insert(index, '(');
        sb.append(')');
        return sb.toString().replace("(0)", "");
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        String ret = test.fractionToDecimal(1, 5);
        System.out.println(ret);
    }
}

reference:
https://discuss.leetcode.com/topic/11851/short-java-solution

直接看的答案。发现Corner case 很多
还要判断 正负号。
记住这个简洁的解法。

最后一块,我一开始写的是:
String.replaceAll("target", "replacedText");
但是注意,这里 replacedText 是 Regular expression, 所以不能用简单的字符串表达。
一般用这个方法: String.replace("target", "replacedText"); 就好了

Anyway, Good luck, Richardo! -- 09/22/2016

你可能感兴趣的:(Leetcode - Fraction to Recurring Decimal)