LeetCode 题解(136): Fraction to Recurring Decimal

来源:互联网 发布:微博个性域名怎么隐藏 编辑:程序博客网 时间:2024/06/10 05:57

题目:

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            


0 0
原创粉丝点击