-1
-2147483648
千算万算,没想到有这个样例…
int的取值范围-231——231-1,也就是-2147483648——2147483647,输入并不越界,中间计算的时候就溢出了,要进行类型转换处理。
还有一个点就是哈希表中存的是当前字符串的长度,便于出现循环节时,将左括号插入到字符串中。
改之前的代码(溢出):
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
// 分子是0
if (numerator == 0)
return "0";
StringBuffer res = new StringBuffer();
// 正负,如果异号,添符号,并且将分子,分母全部变成正数
if (numerator * denominator < 0) {
res.append("-");
numerator = Math.abs(numerator);
denominator = Math.abs(denominator);
}
int quotient = numerator / denominator; //商
int rem = numerator % denominator; //余数
if (rem == 0) { // 能整除,是个整数
res.append(quotient);
return res.toString();
} else { // 小数
res.append(quotient);
res.append(".");
// 下面开始处理小数部分
HashMap<Integer, Integer> hs = new HashMap<>();
int divisor = denominator; // 除数,一直就是分母,不会变
while (rem != 0) {
if(hs.containsKey(rem)) { //如果余数再次出现,循环节就确定了
res.insert(hs.get(rem), "(");
res.append(")");
break;
}
hs.put(rem, res.length());
rem *= 10;
res.append(String.valueOf(rem/divisor));
rem %= divisor;
}
}
return res.toString();
}
}
官方代码
起的变量名讲究,这代码跟书法一样,真好看…
public String fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) {
return "0";
}
StringBuilder fraction = new StringBuilder();
// If either one is negative (not both)
if (numerator < 0 ^ denominator < 0) {
fraction.append("-");
}
// Convert to Long or else abs(-2147483648) overflows
long dividend = Math.abs(Long.valueOf(numerator));
long divisor = Math.abs(Long.valueOf(denominator));
fraction.append(String.valueOf(dividend / divisor));
long remainder = dividend % divisor;
if (remainder == 0) {
return fraction.toString();
}
fraction.append(".");
Map<Long, Integer> map = new HashMap<>();
while (remainder != 0) {
if (map.containsKey(remainder)) {
fraction.insert(map.get(remainder), "(");
fraction.append(")");
break;
}
map.put(remainder, fraction.length());
remainder *= 10;
fraction.append(String.valueOf(remainder / divisor));
remainder %= divisor;
}
return fraction.toString();
}