这题真的挺难的,主要难在数学,哈希表的使用倒是很浅显,我也是看了别人的思路再自己写的。
a/b,a为被除数、b为除数
思路就是把所有补0的被除数都放入哈希表,对应的键值是当前字符串的长度。若出现相同的补过0的被除数则代表接下来除法的结果会开始循环,则跳出循环并在对应位置加括号输出。
几个要判断的地方:
1.假如当前被除数小于除数,加了一位或补了一个0之后还是小于除数,则在结果中应该加0,如1/100=0.01,1/1000=0.001,但若是首位的话,不加0,如100/11=9.0(90),第一位1<11,1加上后面一位变成10后还是小于11,但这里不加0,因为结果字符串还是空的,即要判断一下字符串是否为空。
2.加小数点的时机,是在被除数第一次补0的时候,并且如果加了小数点后字符串首位就是小数点,那在前面还要补个0,如1/10这样的情况,不补0结果就变成.1了。
3.退出循环后,判断下被除数cur是否为空。若为空说明除尽了,直接输出,否则按照题意要在循环开始处和末尾加括号后再输出。
class Solution:
def fractionToDecimal(self, numerator: int, denominator: int) -> str:
if denominator==0:
return 'inf'
m,n=str(abs(numerator)),abs(denominator)
i,siz=1,len(m)
res=''
dic={}
cur=int(m[:i])
dot=0
while i<siz or (cur and cur not in dic) :
# print(res,cur)
if cur<n:
#被除数cur加上后面一位或者补0
if i<siz:
#未到最后一位,就用cur加上后面一位
cur=cur*10+int(m[i])
i+=1
else:
cur=cur*10
dot+=1 #更新dot指示变量
if dot==1: #第一次补0,加上小数点'.'
res+='.'
if res[0]=='.':
res='0'+res
if cur<n and len(res): #首位不补0,中间补0
res+='0'
else:
if dot>=1: #补0的被除数加入字典
dic[cur]=len(res)
#做除法
res+=str(cur//n) #整数部分加入结果
cur=cur%n
if cur:
l=dic[cur]
res=res[:l]+'('+res[l:]+')'
if numerator>0 and denominator<0 or numerator<0 and denominator>0 :
res='-'+res
if not res:
res='0'
return res