原题链接在这里:https://leetcode.com/problems/fraction-to-recurring-decimal/
解这道题的思路就是观察remainder是否出现重复,若出现重复,就进入了infinite loop,需要加括号。
Note: 1. 注意检查corner case,若是 numerator 或 denominator 出现 0的时候,返回相应的值。
2. 注意overflow,Integer.MIN_VALUE 取absolute value 后会溢出。今后凡是遇到Math.abs()时都要注意这一点。
3. StringBulider sb = new StringBuilder(); 是个好东西。sb.toString(); sb.append(str); sb.insert(index,str); 注意练习。
4. 这里的HashMap生成时需注意HashMap<Long,Integer> hm, 首先Long 和 Integer 不同的class,这里put(int, int)会报 错;还有<Long,Integer> 不能省略掉,否则hm.get(key) 返回的值类型会是Object,而不是Integer,不能直接当成index 用。
AC Java:
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if(numerator == 0) return "0"; //corner case error
if(denominator == 0) return null;
long num = numerator;
long den = denominator;
num = Math.abs(num);
den = Math.abs(den);
StringBuilder sb = new StringBuilder();
if((numerator<0) ^ (denominator<0)) //If result is negative, ERROR
sb.append("-");
sb.append(num/den);
long remainder = num % den;
if(remainder == 0)
return sb.toString();
sb.append(".");
HashMap<Long,Integer> hm = new HashMap<>(); //error
int index = 0;
StringBuilder decSb = new StringBuilder();
while(remainder != 0){
if(hm.containsKey(remainder)){
decSb.insert(hm.get(remainder), "(");
decSb.append(")");
sb.append(decSb);
return sb.toString();
}else{
hm.put(remainder,index);
}
index++;
remainder *= 10;
decSb.append(remainder/den);
remainder = remainder%den;
}
sb.append(decSb);
return sb.toString();
}
}