2022跟着leedcode学数据结构--第28天

105 阅读1分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

image.png

分数到小数

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。

如果小数部分为循环小数,则将循环的部分括在括号内。

如果存在多个答案,只需返回 任意一个 。

对于所有给定的输入,保证 答案字符串的长度小于 104 。

示例 1:

  • 输入:numerator = 1, denominator = 2

  • 输出:"0.5"

  • 示例 2:

  • 输入:numerator = 2, denominator = 1

  • 输出:"2"

  • 示例 3:

  • 输入:numerator = 2, denominator = 3

  • 输出:"0.(6)"

  • 示例 4:

  • 输入:numerator = 4, denominator = 333

  • 输出:"0.(012)"

  • 示例 5:

  • 输入:numerator = 1, denominator = 5

  • 输出:"0.2"  

提示:

-231 <= numerator, denominator <= 231 - 1 denominator != 0

相关标签

  • 哈希表
  • 数学
  • 字符串

解题思路:

  • 先判断特殊情况 numerator 是否为0 为0 则直接返回 ”0“
  • 通过内置函数先计算 divmod
  • 设置结果集:ans
  • 通过异或判断
  • 遍历判断 ans.append
  • 最后进行组合"".join(ans)
class Solution:
    def fractionToDecimal(self, numerator: int, denominator: int) -> str:
        if numerator == 0:
            return "0"
        ans = []
        a, remaind = divmod(numer, denomin)
        ans.append(str(a))
        if (numerator < 0) ^ (denominator < 0): 
            ans.append("-")

        numer = abs(numerator)      
        denomin = abs(denominator)

        if remaind == 0:           
            return "".join(res)

        ans.append(".")             
        tmp = {}
        while remaind != 0:
            if remaind in tmp:      
                ans.insert(tmp[remaind], "(")
                ans.append(")")
                break
            
            tmp[remaind] = len(res) 
            remaind *= 10           
            a, remaind = divmod(remaind, denomin)
            ans.append(str(a))

        return "".join(ans)

执行结果:

image.png