LeetCode 题解(136): 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.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".
  • Given numerator = 2, denominator = 3, return "0.(6)".
题解:

用HashMap记录余数作为key与余数出现的位置。C++和Java需要将int转换为long。要注意正负号的问题。

C++版:

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        if(numerator == 0)
            return "0";
            
        string result;
        if((numerator < 0) ^ (denominator < 0))
            result += "-";
            
        long n = numerator;
        long d = denominator;
        n = abs(n);
        d = abs(d);
        result += to_string(n / d);
        long r = n % d;
        if(r == 0)
            return result;
            
        result += ".";
        
        unordered_map<long, int> re;
        while(r) {
            if(re.find(r) != re.end()) {
                result = result.substr(0, re[r]) + "(" + result.substr(re[r], result.length()-re[r]) + ")";
                break;
            }
            re.insert(pair<long, int>(r, result.length()));
            result += to_string(r * 10 / d);
            r = r * 10 % d;
        }
        
        return result;
    }
};

Java版:

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if(numerator == 0)
            return "0";
            
        StringBuilder s = new StringBuilder();
        if((numerator < 0) ^ (denominator < 0))
            s.append("-");
            
        long n = numerator, d = denominator;
        n = Math.abs(n);
        d = Math.abs(d);
        
        s.append(Long.toString(n / d));
        long r = n % d;
        if(r == 0)
            return s.toString();
        s.append(".");
        Map<Integer, Integer> m = new HashMap<>();
        while(r != 0) {
            if(m.containsKey((int)r)) {
                s.insert(m.get((int)r), "(");
                s.append(")");
                break;
            }
            m.put((int)r, s.length());
            s.append(Integer.toString((int)(r * 10 / d)));
            r = r * 10 % d;
        }
        return s.toString();
    }
}

Python版:

class Solution:
    # @param {integer} numerator
    # @param {integer} denominator
    # @return {string}
    def fractionToDecimal(self, numerator, denominator):
        if numerator == 0:
            return "0"
        
        result = ""
        if (numerator < 0) ^ (denominator < 0):
            result += "-"
        numerator = abs(numerator)    
        denominator = abs(denominator)
        result += str(numerator / denominator)
        if numerator % denominator == 0:
            return result
            
        result += "."
        d ={}
        x = numerator % denominator
        while x:
            if x in d:
                result = result[:d[x]] + "(" + result[d[x]:] + ")"
                break
            d[x] = len(result)

            r = (x * 10) / denominator
            x = (x * 10) % denominator
            result += str(r)
        
        return result
            


你可能感兴趣的:(Algorithm,LeetCode,面试题)