当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

[LeetCode]Fraction to Recurring Decimal - EpoTalk

作者:小梦 来源: 网络 时间: 2024-02-05 阅读:

Fraction to Recurring Decimal

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)".

分析

这道题不需要特别的算法。只是在算小数的时候,用个hashmap存余值,从而方便发现循环点。

这种除法的问题,写的时候想一遍过还是得注意很多情况。比如结果正负号,越界,输入为零等情况。我们可以在开始就判断结果的正负,然后直接算绝对值的除法。为避免越界,我们全部变量用Long代替,输入为零的情况也可以开始就先拿出考虑。

复杂度

time: O(n), space: O(n)

代码

public class Solution {    public String fractionToDecimal(int numerator, int denominator) {        // 先考虑输入为零的情况        if (numerator == 0)return "0";        if (denominator == 0)return "";    StringBuilder sb = new StringBuilder();        if ((numerator ^ denominator) >>> 31 == 1) { // 确定结果正负sb.append('-');        }    // 避免越界,变量类型全为Long        long a = Math.abs((long)numerator);        long b = Math.abs((long)denominator);        long intVal = a / b;        long remainder = a % b;        sb.append(intVal); // 添加整数部分    // 开始考虑小数部分        if (remainder > 0) {sb.append('.');int i = sb.length();Map<Long, Integer>  map = new HashMap<>();while (remainder > 0) {    if (map.containsKey(remainder)) { // 发现小数循环        int start = map.get(remainder);        sb.insert(start, "(");        sb.append(")");        break;    }    map.put(remainder, i++);    a = remainder * 10;    long val = a / b;    sb.append(val);    remainder = a % b;}        }        return sb.toString();    }}

热点阅读

网友最爱