My code:
import java.util.HashMap;
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if (denominator == 0)
return null;
else if (numerator == 0)
return String.valueOf(0);
long num = (long) numerator;
long den = (long) denominator;
String ans = "";
if ((num < 0) ^ (den < 0))
ans += "-";
num = Math.abs(num);
den = Math.abs(den);
long res = num / den;
long rem = num % den;
ans = ans + String.valueOf(res);
if (rem == 0)
return ans;
ans += ".";
HashMap<Long, Integer> remains = new HashMap<Long, Integer>();
rem = rem * 10;
while (rem != 0) {
if (remains.containsKey(rem)) {
int begin = remains.get(rem);
String rpt = ans.substring(begin, ans.length());
ans = ans.substring(0, begin);
ans += "(" + rpt + ")";
break;
}
remains.put(rem, ans.length());
ans += String.valueOf(rem / den);
rem = (rem % den) * 10;
}
return ans;
}
public static void main(String[] args) {
Solution test = new Solution();
System.out.println(test.fractionToDecimal(1, 90));
}
}
What’ a fuck!
这道题目是真的麻烦。首先一个难点在于。
如果判断一个小数是否会出现循环情况。我一开始打算用字符串+哈希表判断的。后来发现这是不对的。
这道题木相当于人工写了一个除法器。挺有意思。但是因为我没吃早饭。后期越写越饿。
实在扛不住了,就看了答案。
当余数出现重复时,就出现循环了。
这才开始。
还有考虑余数*10继续不够,该怎么办。只不过也是我考虑的过多了,才写不出来。
这道题木corner case挺多的。
而且我是到后期才意识到,得用hash map
key -> 余数
value -> 该余数对应的除数的下一位index
推荐一个博客,http://blog.csdn.net/ljiabin/article/details/42025037
饿死了。实在写不动了。
**
总结:
Hashmap, Math
**
Anyway, Good luck, Richardo!
My code:
import java.util.HashMap;
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
StringBuilder sb = new StringBuilder();
String sign = (numerator < 0 == denominator < 0 || numerator == 0 ? "" : "-");
sb.append(sign);
long num = Math.abs((long) numerator);
long div = Math.abs((long) denominator);
sb.append(num / div);
long remainder = num % div;
if (remainder == 0) {
return sb.toString();
}
sb.append(".");
HashMap<Long, Integer> map = new HashMap<Long, Integer>();
while (!map.containsKey(remainder)) {
map.put(remainder, sb.length());
sb.append(10 * remainder / div);
remainder = 10 * remainder % div;
}
int index = map.get(remainder);
sb.insert(index, '(');
sb.append(')');
return sb.toString().replace("(0)", "");
}
public static void main(String[] args) {
Solution test = new Solution();
String ret = test.fractionToDecimal(1, 5);
System.out.println(ret);
}
}
reference:
https://discuss.leetcode.com/topic/11851/short-java-solution
直接看的答案。发现Corner case 很多
还要判断 正负号。
记住这个简洁的解法。
最后一块,我一开始写的是:
String.replaceAll(“target”, “replacedText”);
但是注意,这里 replacedText 是 Regular expression, 所以不能用简单的字符串表达。
一般用这个方法: String.replace(“target”, “replacedText”); 就好了
Anyway, Good luck, Richardo! — 09/22/2016