LeetCode:Fraction to Recurring Decimal

1、題幹

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)”.

      題乾的意思是,給兩個整數numerator,denominator,分別作爲分子和分母,現在需要計算他的小數形式,並返回String類型,如果是循環小數,將循環部分用小括號包起來。

2、解題思路

  本題的難點在小數部分計算,具體思路如下:
  1)設兩個變量分別存放每次計算完成的餘數(remainder)和商(integer),並將餘數加入到一個數組中。
  2)每次計算後先到數組中查是否有相同的餘數,如果有則說明出現循環小數。
  3)計算循環小數循環的位數,循環的位數是餘數數組的長度減去重複餘數上一次(也只會出現一次)出現的下標。

3、注意事項

  1)負數情況
  2)Math.abs()處理Integer.MIN_VALUE返回的還是負值,整形衣櫥

4、源碼及註釋

/**
 * Fraction to Recurring Decimal
 * @param numerator
 * @param denominator
 * @return
 */
public String fractionToDecimal(int numerator, int denominator) {
    if (numerator == 0) { //分子爲0
        return "0";
    }

    if (denominator == 0) { //分母爲0,返回空
        return "";
    }

    String result = ""; //存放最終結果

    if (numerator < 0 ^ denominator < 0) { //有一個是負數
        result += "-";
    }

    long first = Math.abs(Long.valueOf(numerator)); //分子
    long second = Math.abs(Long.valueOf(denominator)); //分母

    long integer = first / second; //整數部分
    long remainder = first % second; //餘數
    if (remainder == 0) { //能夠整除
        result += String.valueOf(integer);
        return result;
    } else { //有小數
        result = result + String.valueOf(integer) + ".";
    }
    List list = new ArrayList<>(); //存放餘數, 下表即是餘數出現的位置
    list.add(remainder);
    while (remainder != 0) {
        integer = remainder * 10 / second; //小數部分的結果
        remainder = remainder * 10 % second; //餘數
        if (list.contains(remainder)) { //餘數存在則說明出現了循環小數
            result += String.valueOf(integer);
            int position = list.size() - list.indexOf(remainder); //"("需要添加的位置,從後向前數
            int length = result.length(); //字符串長度
            String repeatNum = "(" + result.substring(length - position, length) + ")";
            String notRepeatNum = result.substring(0,length - position);
            result = notRepeatNum.concat(repeatNum);
            return result;
        }

        result += String.valueOf(integer); //正常計算
        list.add(remainder); //餘數存入map
    }
    return result;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章