166. Fraction to Recurring Decimal

题目链接:https://leetcode.com/problems/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.

Example 1:

Input: numerator = 1, denominator = 2
Output: "0.5"

Example 2:

Input: numerator = 2, denominator = 1
Output: "2"

Example 3:

Input: numerator = 2, denominator = 3
Output: "0.(6)"

思路:

用空间换时间,用HashMap来存储余数以及对应的下标,以便在有括号时可以插入。

比如 3227/555=5.8144144144.....

第一个余数为 452 此时StringBuilder里面只有"5"和符号".",商为8,存储的下标为2;

然后再次取余得 80 ,商为1,存储的下标为3;

取余得245,商为4,存储的下标为4;

取余得230,商为4,存储的下标为5;

取余得80,由于之前遇到80时已经存储过,由此可以判断存在重复,所以从先前80的位置,商是重复的。

所以从下标为3的地方插入左括号,在StringBuilder末尾插入右括号;

代码如下:

AC 1ms beats100%:

class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if(numerator==0)
            return "0";
        StringBuilder ans=new StringBuilder();
        boolean sign=false;
        if((numerator>0&&denominator>0)||(numerator<0&&denominator<0))
            sign=true;
        ans.append(sign?"":"-");
        long num =Math.abs((long)numerator);
        long den =Math.abs((long)denominator);
        ans.append(num/den);
        long remain=num%den;
        if(remain==0)
            return ans.toString();
        ans.append(".");
        Map<Long,Integer> map=new HashMap();
        map.put(remain,ans.length());
        while(remain!=0){
            remain=remain*10;
            ans.append(remain/den);
            remain=remain%den;
            if(!map.containsKey(remain))
                map.put(remain,ans.length());
            else{
                int index=map.get(remain);
                ans.insert(index,"(");
                ans.append(")");
                break;
            }
        }
        return ans.toString();
    }
}

至于为什么是Long来存储余数,主要是余数还有一个*10操作,怕遇到极少数情况越界。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值