LeetCode 166: Fraction to Recurring Decimal

LeetCode 166: Fraction to Recurring Decimal

代码一

import java.util.Hashtable;
public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {

        if (numerator == 0) return "0";
        long num = Math.abs((long) numerator), den = Math.abs((long) denominator);

        String ret = "";
        if ((numerator + 0.0) / denominator < 0) ret += "-";
        ret += num / den;
        num = num % den;
        if (num == 0) return ret;
        else ret += ".";

        Hashtable<Long, Integer> hashtable = new Hashtable<Long,Integer>();
        int position = 0, start = 0, end = 0, index = ret.indexOf("."); 

        while (num != 0) {
            position++; //the position after the digital point
            if (hashtable.containsKey(num)) {
                start = hashtable.get(num);
                end = position - 1;
                ret = ret.substring(0, index + start) + "(" + ret.substring(index + start, index + end + 1) + ")";
                return ret;
            } else {
                hashtable.put(num, position);
                num *= 10;
                ret += num / den;
                num %= den;
            }
        }
        return ret;
    }
}

总结

  1. 这题核心是哈希表,但是之前思路是用哈希表存储商和位置,但是正确是存储余数和位置;当出现重复余数时,循环开始;但是当出现重复商时,不一定是循环开始;
  2. 用long处理特殊int,如Integer.MIN_VALUE;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值