[LeetCode]Fraction to Recurring Decimal

来源:互联网 发布:龙城霸业 boss积分数据 编辑:程序博客网 时间:2024/05/18 14:23

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

本题难度Medium。

【题意】
本题是给定分子和分母,将其转换为小数,如果是循环小数就对其循环部分用括号括起来。

哈希法

【复杂度】
时间 O(N) 空间 O(N)

【思路】
这道题有几个难点(部分在Hint里面有):

  1. 要记得对负数情况进行判断
  2. 分子可能会大于分母。因此就区分开来计算,先计算小数点前的,再计算小数点后的
  3. 对于循环小数的判断。采用哈希表来记录被除数和除得的结果在字符串中的位置;在除之前,如果被除数在哈希表中已经记录过,说明这部分为循环,因此用括号括起这部分。
  4. 还要考虑除数与被除数可能是Integer.MIN_VALUE,它们转换为正数会溢出,因此应该用long型变量储存。

【注意】

  • 在判断除的结果为正负时,如果用numerator/denominator<0来判断,那么当numerator=7,denominator=-12时,得到的结果为0,会导致判断失误。所以使用了较为繁琐的判断:

(numerator>0&&denominator<0)||(numerator<0&&denominator>0)

  • 对于除数为0这种非法情况,假定返回值为"0"

【代码】

public class Solution {    public String fractionToDecimal(int numerator, int denominator) {        //require        if(denominator==0)return "0";        StringBuilder sb=new StringBuilder();        Map<Long,Integer> map=new HashMap<>();        //正负数检测        if((numerator>0&&denominator<0)||(numerator<0&&denominator>0))sb.append("-");        long dividend=Math.abs((long)numerator),divisor=Math.abs((long)denominator);        //invariant        //计算小数点之前        sb.append(dividend/divisor);        //计算小数点之后        dividend=dividend%divisor*10;        if(dividend==0)return sb.toString();        else{            sb.append(".");            while(dividend!=0){                //看是否有循环小数                if(map.containsKey(dividend)){                    sb.insert(map.get(dividend),"(");                    sb.append(")");                    break;                }                //记录该被除数的结果在sb的插入位置                map.put(dividend,sb.length());                sb.append(dividend/divisor);                dividend=dividend%divisor*10;            }        }        //ensure        return sb.toString();    }}
0 0
原创粉丝点击