Leetcode 166. 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)".

思路:把分數(shù)轉(zhuǎn)化為小數(shù)表示,循環(huán)部分用括號括起來。
自己開始的想法是用hashmap記錄每次除數(shù)的位置,但是除數(shù)有可能存在連續(xù)幾個0的情況,所以是有問題的,正確的方法是map記錄每次余數(shù)的位置。
題目的幾個坑:除數(shù)為0、被除數(shù)為0、正好整除無小數(shù)、商是負數(shù)以及商溢出的這幾種情況都要考慮到。
先放自己有問題的代碼:

public String fractionToDecimal(int numerator, int denominator) {
    if (denominator == 0) {
        return String.valueOf(Integer.MAX_VALUE);
    }
    if (numerator == 0) {
        return "0";
    }
    boolean negative = false;
    if ((numerator > 0 && denominator < 0) || (numerator < 0 && denominator > 0)) {
        negative = true;
    }
    numerator = Math.abs(numerator);
    denominator = Math.abs(denominator);

    int dotLeft = numerator / denominator;
    int yushu = numerator % denominator;
    if (yushu == 0) {
        return String.valueOf(dotLeft);
    }

    String dotRight = "";
    int[] map = new int[10];
    int cnt = 1;
    while (yushu > 0) {
        int cur = yushu * 10;
        int devide = cur / denominator;
        if (map[devide] > 0) {
            dotRight = dotRight.substring(0, map[devide]-1) + "(" + dotRight.substring(map[devide]-1) + ")";
            break;
        }
        dotRight += String.valueOf(devide);
        map[devide] = cnt;
        yushu = cur % denominator;
        cnt++;
    }

    return (negative ? "-" : "") + String.valueOf(dotLeft) + "." + String.valueOf(dotRight);
}

下面是solution給出的標準解答,對比起來自己的代碼丑哭了。。。

public String fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) {
    return "0";
}
StringBuilder fraction = new StringBuilder();
// If either one is negative (not both)
if (numerator < 0 ^ denominator < 0) {
    fraction.append("-");
}
// Convert to Long or else abs(-2147483648) overflows
long dividend = Math.abs(Long.valueOf(numerator));
long divisor = Math.abs(Long.valueOf(denominator));
fraction.append(String.valueOf(dividend / divisor));
long remainder = dividend % divisor;
if (remainder == 0) {
    return fraction.toString();
}
fraction.append(".");
Map<Long, Integer> map = new HashMap<>();
while (remainder != 0) {
    if (map.containsKey(remainder)) {
        fraction.insert(map.get(remainder), "(");
        fraction.append(")");
        break;
    }
    map.put(remainder, fraction.length());
    remainder *= 10;
    fraction.append(String.valueOf(remainder / divisor));
    remainder %= divisor;
}
return fraction.toString();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容