题目链接:https://leetcode.com/problems/fraction-to-recurring-decimal/
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.
Example 1:
Input: numerator = 1, denominator = 2 Output: "0.5"
Example 2:
Input: numerator = 2, denominator = 1 Output: "2"
Example 3:
Input: numerator = 2, denominator = 3 Output: "0.(6)"
思路:
用空间换时间,用HashMap来存储余数以及对应的下标,以便在有括号时可以插入。
比如 3227/555=5.8144144144.....
第一个余数为 452 此时StringBuilder里面只有"5"和符号".",商为8,存储的下标为2;
然后再次取余得 80 ,商为1,存储的下标为3;
取余得245,商为4,存储的下标为4;
取余得230,商为4,存储的下标为5;
取余得80,由于之前遇到80时已经存储过,由此可以判断存在重复,所以从先前80的位置,商是重复的。
所以从下标为3的地方插入左括号,在StringBuilder末尾插入右括号;
代码如下:
AC 1ms beats100%:
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if(numerator==0)
return "0";
StringBuilder ans=new StringBuilder();
boolean sign=false;
if((numerator>0&&denominator>0)||(numerator<0&&denominator<0))
sign=true;
ans.append(sign?"":"-");
long num =Math.abs((long)numerator);
long den =Math.abs((long)denominator);
ans.append(num/den);
long remain=num%den;
if(remain==0)
return ans.toString();
ans.append(".");
Map<Long,Integer> map=new HashMap();
map.put(remain,ans.length());
while(remain!=0){
remain=remain*10;
ans.append(remain/den);
remain=remain%den;
if(!map.containsKey(remain))
map.put(remain,ans.length());
else{
int index=map.get(remain);
ans.insert(index,"(");
ans.append(")");
break;
}
}
return ans.toString();
}
}
至于为什么是Long来存储余数,主要是余数还有一个*10操作,怕遇到极少数情况越界。