[Leetcode] Fraction to Recurring Decimal 分数转为循环小数

news/2024/6/17 23:41:22 标签: 数据结构与算法

Fraction to Recurring Decimal

最新解法及思路:https://yanjia.me/zh/2018/11/...

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.

For example,

Given numerator = 1, denominator = 2, return "0.5". Given numerator = 2, denominator = 1, return "2". Given numerator = 2, denominator = 3, return "0.(6)".

哈希表法

复杂度

时间 O(N) 空间 O(N)

思路

整数部分很好处理,只要注意正负号的区分就行了,但是如何处理小数部分呢。如果只是简单的除法,那我们每次把余数乘以10,再除以被除数就可以得到当前位的小数了,得到新的余数,直到余数为0。难点在于,对于无尽循环小数,我们一直这么做永远也不能让余数变为0。这里我们可以用一个哈希表记录每次的余数,如果余数出现重复的时候,说明就产生循环了。为了能找出小数中循环的部分,我们在用哈希表时,还要把每个余数对应的小数位记录下来,这样子我们一旦遇到重复,就知道是从哪里开始循环的。

注意

如果输入的被除数很大,那么余数乘以10有可能溢出,所以我们用long来保存numerator和denominator。

代码

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        long num = numerator;
        long den = denominator;
        if(num == 0 || den == 0){
            return "0";
        }
        // 判断结果正负号
        boolean negative = (num > 0 && den < 0) || (num < 0 && den > 0);
        num = Math.abs(num);
        den = Math.abs(den);
        // 得到整数部分
        String integ = (negative ? "-" : "") + String.valueOf(num / den);
        // 如果存在小数部分
        if(num % den != 0){
            num = num % den;
            HashMap<Long, Integer> map = new HashMap<Long, Integer>();
            int pos = 0;
            map.put(num, pos);
            StringBuilder frac = new StringBuilder();
            // 计算小数部分
            while(num != 0){
                // 先把算出的小数加上,再判断余数是否重复,如果余数重复的话,小数会从下一个开始重复
                num = num * 10;
                frac.append(num / den);
                num = num % den;
                // 如果该余数之前出现过,说明有循环,上次出现的位置到当前位置就是循环的部分
                if(map.containsKey(num)){
                    // 将非循环部分和循环部分分开
                    String pre = frac.substring(0, map.get(num));
                    String loop = frac.substring(map.get(num));
                    // 返回有循环的结果
                    return integ + "." + pre + "(" + loop + ")";
                }
                pos++;
                // 记录下当前余数和他对应小数的位置
                map.put(num, pos);
            }
            // 返回无循环有小数的结果
            return integ + "." + frac.toString();
        }
        // 返回无小数的结果
        return integ;
    }
}

http://www.niftyadmin.cn/n/1593641.html

相关文章

linux 组权限bug,Sudo bug 可导致 Linux和macOS 普通用户获得 root 权限

存在十年之久的sudo漏洞在Linux和macOS中公开&#xff0c;它允许任何用户获得root特权&#xff0c;现在终于在1.8.31版本中对其进行了修补。该安全漏洞位于pwfeedback选项中&#xff0c;该选项默认在Linux Mint和elementary OS等发行版中启用。由于存在此错误&#xff0c;即使用…

Java面试题总结(基础面试题完结版,java使用教程书

同理&#xff1a;Collections包也提供了对list和set集合的方法。 Collections.unmodifiableList(List) Collections.unmodifiableSet(Set) 五、队列和栈是什么&#xff1f;有什么区别&#xff1f; 1、队列先进先出&#xff0c;栈先进后出。 2、遍历数据速度不同。 栈只能从…

struts2+jquery 实现ajax无刷新更新数据

为什么80%的码农都做不了架构师&#xff1f;>>> 前几天为了实现一个struts 的 ajax无刷新更新数据的例子&#xff0c;发现网上资料很少&#xff0c;很多已经过时或者链接都失效了 不过整合他们的资料&#xff0c;加上自己的研究&#xff0c;终于实现了效果 要求&am…

递归重命名文件linux,linux – 如何使用来自Bash的iconv递归重命名文件和文件夹

我认为以下内容可以在一次通过中完成您想要的一切.# Update: if this doesnt work, use read -d insteadfind . -print0 | while IFS read -d $\000 f ;doorig_f"$f"# Below is pure bash. You can replace with tr if you like# f"$( echo $f | tr -d ,\ | tr…

JVM总体概述,java架构师必备技能

JVM字节码 JVM使用Java字节码的方式&#xff0c;作为Java 用户语言 和 机器语言 之间的中间语言。实现一个通用的、 机器无关 的执行平台。 JVM能干什么 基于安全方面考虑&#xff0c;JVM 要求在 class 文件中使用强制性的语法和约束&#xff0c;但任意一门语言都可以转换为被…

MySQL Replication常见错误整理

MySQL Replication常见错误整理 2013-11-06 12:17:39分类&#xff1a; Linux这篇文章旨在记录MySQL Replication的常见错误&#xff0c;包括自己工作中遇到的与网友在工作中遇到的&#xff0c;方面自己及别人以后进行查找。每个案例都是通过Last_IO_Errno/Last_IO_Error或者Las…

linux 性能测试iostat,linux 性能工具之iostat

报告中央处理器(CPU)统计信息和整个系统、适配器、tty 设备、磁盘和 CD-ROM 的输入&#xff0f;输出统计信息。51Testing软件测试网%gkrc8qV"l1R3r语法51Testing软件测试网y8N mn:m(Gf2}ziostat[-s] [-a] [-d|-t] [-T][-m][PhysicalVolume... ] [Interval[Count] ]51Testi…

Kafka发送原理剖析其他生产者参数,2021年字节跳动、阿里等大厂最全Java面试题

这个参数用来指定分区中必须有多少个副本收到这条消息&#xff0c;之后生产者才会认为这条消息时写入成功的。acks是生产者客户端中非常重要的一个参数&#xff0c;它涉及到消息的可靠性和吞吐量之间的权衡。 ack0&#xff0c; 生产者在成功写入消息之前不会等待任何来自服务器…