这个题解使用哈希表来判断小数部分是否存在循环。首先计算整数部分,然后对余数进行逐位计算,同时用哈希表记录每个余数出现的位置。如果某个余数再次出现,说明从上次出现的位置到当前位置构成循环节。最后根据是否存在循环节,构造出最终的结果字符串。
时间复杂度: O(denominator)
空间复杂度: O(denominator)
class Solution:
def fractionToDecimal(self, numerator: int, denominator: int) -> str:
# 处理符号
s = '-' if numerator and numerator ^ denominator < 0 else ''
numerator = abs(numerator)
denominator = abs(denominator)
# 计算整数部分
d = numerator // denominator
numerator %= denominator
# 如果没有余数,直接返回结果
if numerator == 0:
return s+str(d)
# 哈希表记录每个余数出现的位置
past_res = {}
digits = [s, str(d), '.']
th = 2
# 对余数进行逐位计算
while numerator and numerator not in past_res:
th += 1
past_res[numerator] = th
numerator *= 10
d = numerator // denominator
digits.append(str(d))
numerator %= denominator
# 构造最终结果字符串
return ''.join(digits) if not numerator else ''.join(digits[:past_res[numerator]]) + '(' + ''.join(digits[past_res[numerator]:]) +')'