0%

166. Fraction to Recurring Decimal

O(n) time
这道题的hashmap的key必须是余数(被除数)不能用商(数字)因为商可能相同但被除数不同,比如1/333小数部分开始都是0但是被除数是不一样的所以并不是循环节,真正的循环节首尾的被除数必须是一样的!

  1. 判断被除数是否为0,是0直接返回0
  2. 判断结果是否为负
  3. 先处理整数部分,如果余数为0,直接返回结果
  4. 处理小数部分,用一个hashmap维护小数部分每个数字的下标,方便后边插入左括号
  5. 如果找到重复的数字,看该数字是否为0,如果是0则没有循环节不需要插入括号
  6. 用hashmap找到需要插入左括号的位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) return "0";
string integer, decimal;
if ((numerator ^ denominator) < 0) {
integer += '-';
}
long n = labs(numerator), d = labs(denominator);
integer += to_string(n / d);
n %= d;
if (0 == n) return integer;
integer += '.';
unordered_map<int, int> m; // key是余数,value是在小数部分插入左括号的可能位置的下标
while (n > 0 && m.count(n) == 0) {
m[n] = decimal.length();
n *= 10;
decimal += to_string(n / d);
n %= d;
}
if (n == 0) return integer + decimal;
decimal.insert(m[n], "(");
return integer + decimal + ")";
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) return "0";
string integer, decimal;
if ((numerator ^ denominator) < 0) {
integer += '-';
}
long n = labs(numerator), d = labs(denominator);
integer += to_string(n / d);
n %= d;
if (0 == n) return integer;
integer += '.';
n *= 10;
int i(-1);
unordered_map<int, int> m;
auto it = m.find(n);
while (it == m.end()) {
m.emplace(n, ++i);
decimal += to_string(n / d);
n %= d;
if (0 == n) return integer + decimal;
n *= 10;
it = m.find(n);
}
decimal.insert(it->second, "(");
return integer + decimal + ')';
}
};