本文主要是介绍老卫带你学---leetcode刷题(166. 分数到小数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
166. 分数到小数
问题
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
示例 1:
输入:numerator = 1, denominator = 2
输出:“0.5”
示例 2:
输入:numerator = 2, denominator = 1
输出:“2”
示例 3:
输入:numerator = 4, denominator = 333
输出:“0.(012)”
提示:
-231 <= numerator, denominator <= 231 - 1
denominator != 0
解决
其实就是处理三种情况:
- 正负号
- 有小数情况
- 余数循环情况(找到位置,插入括号)
class Solution:def fractionToDecimal(self, numerator: int, denominator: int) -> str:if numerator==0:return "0"res=[]# 首先判断结果正负, 异或作用就是 两个数不同 为 True 即 1 ^ 0 = 1 或者 0 ^ 1 = 1if (numerator>0)^(denominator>0):res.append("-")numerator,denominator=abs(numerator),abs(denominator)# 判读到底有没有小数a,b=divmod(numerator,denominator)res.append(str(a))# 无小数if b==0:return "".join(res)# 处理余数# 把所有出现过的余数记录下来res.append(".")dic={b:len(res)} #这里插的位置是为了后面insert括号时找到while b:b*=10a,b=divmod(b,denominator)res.append(str(a))# 余数前面出现过,说明开始循环了,加括号if b in dic:res.insert(dic[b],"(")res.append(")")break# 在把该位置的记录下来dic[b]=len(res)return "".join(res)
这篇关于老卫带你学---leetcode刷题(166. 分数到小数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!