LeetCode166——分数到小数

本文介绍了LeetCode第166题的解决方案,即如何将分数转换为小数。使用HashMap存储被除数与余数的对应关系,HashSet记录循环部分。处理负数和可能的数据越界问题,以及寻找小数循环部分的策略。代码实现采用Java,时间复杂度与输入数据相关,空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的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解题报告:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值