算法记录
LeetCode 题目:
给定两个整数,分别表示分数的分子 numerator
和分母 denominator
,以 字符串形式返回小数 。
说明
一、题目
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104
。
二、分析
- 题目纯粹的考察变编码能力,没有涉及什么算法。
- 需要注意的是
32
位数字的越界问题,因此可以将数据转换为long
来进行运算。 - 还有一个就是循环小数点的判断,出现循环的条件肯定是当前的除数已经在之前处理过了,现在有进行处理,那么就进入了循环需要退出,这里就可以使用一个 Map 来进行处理过的数据的保留。
- 最后只需要在返回的时候在开始出现循环的位置添加上括号即可。
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
long numerators = numerator, denominators = denominator;
StringBuilder builder = new StringBuilder(), last = new StringBuilder();
if(numerators % denominators == 0) {
return String.valueOf(numerators / denominators);
}
if(numerators < 0 ^ denominators < 0) {
builder.append("-");
}
long n = Math.abs(numerators), d = Math.abs(denominators);
builder.append(n / d);
builder.append(".");
n %= d;
int index = 0;
Map<Long, Integer> map = new HashMap();
while(n != 0 && !map.containsKey(n)) {
System.out.print(d + " ");
map.put(n, index);
n *= 10;
last.append(n / d);
n %= d;
index++;
}
if(n != 0) {
int ind = map.get(n);
last.insert(ind, '(');
last.append(")");
}
builder.append(last.toString());
return builder.toString();
}
}
总结
编码能力的考察。