边工作边刷题:70天一遍leetcode: day 6
Fraction to Recurring Decimal
要点:
- 基本公式:当余数小于除数,那么X10然后继续,这个意思就是小数位的数值表示的是余数相对于除数在10中占几份。
- 注意小数点左边是不用按位计算的,直接一个除法
- 如何计算循环部分?因为循环部分只会出现在末尾,直观的想法是最后再把循环位补到字符串结果里。但是这个方法行不通,因为不知道从哪个位置
注意点:
- 符号:记录 => 取abs => 取反
- 如何记录循环:如果remaining已经在map里了,说明之后的计算就是重复之前的
class Solution(object):
def fractionToDecimal(self, numerator, denominator):
"""
:type numerator: int
:type denominator: int
:rtype: str
"""
sign = 1
if numerator<0:
sign = -1
numerator = -numerator
if denominator<0:
sign = -sign
denominator = -denominator
q = numerator/denominator
r = numerator-q*denominator
hmap = {}
res = []
if sign==-1 and (q!=0 or r!=0): res = ["-"]
res.append(str(q))
if r>0: res.append(".")
while r>0:
print r
if r in hmap:
res.insert(hmap[r],"(")
res.append(")")
break
else:
hmap[r]=len(res)
q = r*10/denominator
r = r*10-q*denominator
res.append(str(q))
return ''.join(res)