题目描述
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
If the fractional part is repeating, enclose the repeating part in parentheses.
题目大意
给两个数字,分别代表分子和分母,将该分数形式转换为小数形式以字符串格式返回,其中小数点后如果出现重复的形式,用“()”将重复部分括起来。
示例
E1
Input: numerator = 1, denominator = 2 Output: "0.5"
E2
Input: numerator = 2, denominator = 1 Output: "2"
E3
Input: numerator = 2, denominator = 3 Output: "0.(6)"
解题思路
用map保存小数点之后的位置,当遇到重复的数字时,将’(‘插入该位置,并在最后加入’)‘,并返回结果。
注意越界情况(用long代替int)以及负数情况(判断加负号)。
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
代码
class Solution { public: string fractionToDecimal(int n, int d) { if(n == 0) return "0"; string ans = ""; if((n < 0) ^ (d < 0)) ans += '-'; long ld = labs(d), ln = labs(n), r = ln % ld; ans += to_string(ln / ld); if(!r) return ans; ans += '.'; unordered_map<long, int> m; //依次计算小数点之后的各个小数的数值并判断是否已经出现 while(r) { //如果出现重复,则将双括号添加到结果中返回 if(m.find(r) != m.end()) { ans.insert(m[r], "("); ans += ')'; break; } //否则记录未重复的小数的位置,并计算下一位小数 m[r] = ans.length(); r *= 10; ans += to_string(r / ld); r %= ld; } return ans; } };