发布于 2016-01-12 02:56:46 | 169 次阅读 | 评论: 0 | 来源: PHPERZ
Leetcode 在线编程网站
leetcode 是一个美国的在线编程网站,上面主要收集了各大IT公司的笔试面试题,对于应届毕业生找工作是一个不可多得的好帮手。
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.
For example,
Given numerator = 1, denominator = 2, return "0.5".
Given numerator = 2, denominator = 1, return "2".
Given numerator = 2, denominator = 3, return "0.(6)".
这道题不需要特别的算法。只是在算小数的时候,用个hashmap存余值,从而方便发现循环点。
这种除法的问题,写的时候想一遍过还是得注意很多情况。比如结果正负号,越界,输入为零等情况。我们可以在开始就判断结果的正负,然后直接算绝对值的除法。为避免越界,我们全部变量用Long代替,输入为零的情况也可以开始就先拿出考虑。
time: O(n), space: O(n)
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
// 先考虑输入为零的情况
if (numerator == 0)
return "0";
if (denominator == 0)
return "";
StringBuilder sb = new StringBuilder();
if ((numerator ^ denominator) >>> 31 == 1) { // 确定结果正负
sb.append('-');
}
// 避免越界,变量类型全为Long
long a = Math.abs((long)numerator);
long b = Math.abs((long)denominator);
long intVal = a / b;
long remainder = a % b;
sb.append(intVal); // 添加整数部分
// 开始考虑小数部分
if (remainder > 0) {
sb.append('.');
int i = sb.length();
Map<Long, Integer> map = new HashMap<>();
while (remainder > 0) {
if (map.containsKey(remainder)) { // 发现小数循环
int start = map.get(remainder);
sb.insert(start, "(");
sb.append(")");
break;
}
map.put(remainder, i++);
a = remainder * 10;
long val = a / b;
sb.append(val);
remainder = a % b;
}
}
return sb.toString();
}
}