LeetCode Fraction to Recurring Decimal

原题链接在这里:https://leetcode.com/problems/fraction-to-recurring-decimal/

解这道题的思路就是观察remainder是否出现重复,若出现重复,就进入了infinite loop,需要加括号。

Note: 1. 注意检查corner case,若是 numerator 或 denominator 出现 0的时候,返回相应的值。

           2. 注意overflow,Integer.MIN_VALUE 取absolute value 后会溢出。今后凡是遇到Math.abs()时都要注意这一点。

3. StringBulider sb = new StringBuilder(); 是个好东西。sb.toString(); sb.append(str); sb.insert(index,str); 注意练习。

4. 这里的HashMap生成时需注意HashMap<Long,Integer> hm, 首先Long 和 Integer 不同的class,这里put(int, int)会报 错;还有<Long,Integer> 不能省略掉,否则hm.get(key) 返回的值类型会是Object,而不是Integer,不能直接当成index 用。

AC Java:

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if(numerator == 0) return "0"; //corner case error
        if(denominator == 0) return null;
        
        long num = numerator;
        long den = denominator;
        
        num = Math.abs(num);
        den = Math.abs(den);
        
        StringBuilder sb = new StringBuilder();
        if((numerator<0) ^ (denominator<0)) //If result is negative, ERROR
            sb.append("-");
            
        sb.append(num/den);
        long remainder = num % den;
        if(remainder == 0)
            return sb.toString();
            
        sb.append(".");
        HashMap<Long,Integer> hm = new HashMap<>(); //error
        
        int index = 0;
        StringBuilder decSb = new StringBuilder();
        while(remainder != 0){
            if(hm.containsKey(remainder)){
                decSb.insert(hm.get(remainder), "(");
                decSb.append(")");
                sb.append(decSb);
                return sb.toString();
            }else{
                hm.put(remainder,index);
            }
            
            index++;
            remainder *= 10;
            decSb.append(remainder/den);
            remainder = remainder%den;
        }
        sb.append(decSb);
        return sb.toString();
        
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值