zoukankan      html  css  js  c++  java
  • LeetCode-166 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.

    题目大意

    给两个数字,分别代表分子和分母,将该分数形式转换为小数形式以字符串格式返回,其中小数点后如果出现重复的形式,用“()”将重复部分括起来。

    示例

    E1

    Input: numerator = 1, denominator = 2
    Output: "0.5"

    E2

    Input: numerator = 2, denominator = 1
    Output: "2"

    E3

    Input: numerator = 2, denominator = 3
    Output: "0.(6)"

    解题思路

    用map保存小数点之后的位置,当遇到重复的数字时,将’(‘插入该位置,并在最后加入’)‘,并返回结果。

    注意越界情况(用long代替int)以及负数情况(判断加负号)。

    复杂度分析

    时间复杂度:O(n)

    空间复杂度:O(n)

    代码

    class Solution {
    public:
        string fractionToDecimal(int n, int d) {
            if(n == 0)
                return "0";
            string ans = "";
            if((n < 0) ^ (d < 0))
                ans += '-';
            long ld = labs(d), ln = labs(n), r = ln % ld;
            ans += to_string(ln / ld);
            if(!r)
                return ans;
            
            ans += '.';
            unordered_map<long, int> m;
            //依次计算小数点之后的各个小数的数值并判断是否已经出现
            while(r) {
                //如果出现重复,则将双括号添加到结果中返回
                if(m.find(r) != m.end()) {
                    ans.insert(m[r], "(");
                    ans += ')';
                    break;
                }
                //否则记录未重复的小数的位置,并计算下一位小数
                m[r] = ans.length();
                r *= 10;
                ans += to_string(r / ld);
                r %= ld;
            }
            
            return ans;
        }
    };
  • 相关阅读:
    【转】人类的心理行为模式----《影响力》笔记
    c++类型形参的实参的受限转换
    如何确定网页和查询的相关性
    英语美文摘要
    特殊的字符数组
    c++中的虚函数
    [C#] 常用工具类——应用程序属性信息访问类
    c#常用工具类:文件和二进制转换
    [C#] 常用工具类——文件操作类
    Lamda和Linq语法对比详细
  • 原文地址:https://www.cnblogs.com/heyn1/p/10952043.html
Copyright © 2011-2022 走看看