Fraction to Recurring Decimal

难点:如何识别循环体?

解决方法:用一个HashMap记录每一个余数,当出现重复的余数时,那么将会进入循环,两个重复余数之间的部分就是循环体。

示例:1/13=0.076923076923076923...,当小数部分第二次出现0时,就意味着开始了循环,那么需要把076923用括号括起来,结果为0.(076923)。

涉及技巧:1)在不断相除的过程中,把余数乘以10再进行下一次相除,保证一直是整数相除;2)HashMap的key和value分别是<当前余数, 对应结果下标>,这样获取076923时就可根据value值来找。

注意点1:考虑正负数,先判断符号,然后都转化为正数;

注意点2:考虑溢出,如果输入为Integer.MIN_VALUE,取绝对值后会溢出。

Divide Two Numbers 对最小负数的处理相似。


public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if(numerator == 0) return "0";
long n = numerator, d = denominator;
StringBuilder sb = new StringBuilder();
if(n * d < 0) sb.append("-");
n = Math.abs(n);
d = Math.abs(d);
sb.append(n / d);
long r = n % d;
if(r == 0) return sb.toString();
sb.append(".");
HashMap<Long, Integer> map = new HashMap<Long, Integer>();
while(r != 0) {
if(map.containsKey(r)) {
sb.insert(map.get(r), "(");
sb.append(")");
break;
}
map.put(r, sb.length());
r = r * 10;
sb.append(r / d);
r = r % d;
}
return sb.toString();
}
}


posted @ 2014-12-31 11:58  江南第一少  阅读(118)  评论(0)    收藏  举报