LeetCode166——分数到小数

版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/86475360

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/fraction-to-recurring-decimal/description/

题目描述:

知识点:数据越界、哈希表

思路:用HashMap存储被除数对应的余数,用HashSet存储循环部分的值

首先,我们需要对负号进行处理,把负数全部转变为正数来处理。如果numerator和denominator不同号,我们需要增添负号。当然,如果结果是0,我们就不需要增添负号。特别注意的一点是,对于int型整数来说,其范围是[-2147483648, 2147483647],如果将-2147483648转换成正数,会产生数据越界问题,因此我们重载方法, 用long型数据来处理。

对于寻找小数的循环部分,我采取的方法遍历了循环部分两次。第一次遍历记录相应被除数对应的余数,并用StringBuilder类型的decimal变量记录小数部分。一旦出现了重复的被除数,说明我们第二次进入了循环部分,这时候我们开始在HashSet中填充值来记录循环部分对应的被除数,同时用StringBuilder类型的loop变量记录循环部分的被除数对应的商。

最后对于没有循环小数的情况,我们直接将小数部分decimal拼接到整数部分即可。对于有循环小数的情况,我们的拼接分为三部分:整数部分 + 非循环小数部分 + 循环小数部分

时间复杂度和输入的数据有关。空间复杂度是O(1)。

JAVA代码:

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        return fractionToDecimal((long)numerator, (long)denominator);
    }
    public String fractionToDecimal(long numerator, long denominator) {
        StringBuilder stringBuilder = new StringBuilder();
        boolean flag = true;
        if(numerator < 0){
            flag = !flag;
            numerator *= -1;
        }
        if(denominator < 0){
            flag = !flag;
            numerator *= -1;
        }
        if(!flag && 0 != numerator){
            stringBuilder.append("-");
        }
        long integer = numerator / denominator;
        stringBuilder.append(integer);
        if(0 == numerator % denominator){
            return stringBuilder.toString();
        }
        stringBuilder.append(".");
        StringBuilder decimal = new StringBuilder();
        numerator -= integer * denominator;
        HashMap<Long, Long> hashMap = new HashMap<>();    //键代表的是被除数,值代表的是余数
        HashSet<Long> hashSet = new HashSet<>(); //存储重复的被除数
        StringBuilder loop = new StringBuilder();
        while(0 != numerator){
            decimal.append(numerator * 10 / denominator);
            hashMap.put(numerator, numerator * 10 % denominator);
            numerator = hashMap.get(numerator);
            if(hashMap.containsKey(numerator)){
                if(hashSet.contains(numerator)){
                    break;
                }else{
                    loop.append(numerator * 10 / denominator);
                    hashSet.add(numerator);
                }

            }
        }
        if(0 != numerator){
            return stringBuilder.toString() + decimal.substring(0, decimal.indexOf(loop.toString())) + "(" + loop + ")";
        }else{
            return stringBuilder.append(decimal).toString();
        }
    }
}

LeetCode解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/86475360