版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/86475360
我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/fraction-to-recurring-decimal/description/
题目描述:
知识点:数据越界、哈希表
思路:用HashMap存储被除数对应的余数,用HashSet存储循环部分的值
首先,我们需要对负号进行处理,把负数全部转变为正数来处理。如果numerator和denominator不同号,我们需要增添负号。当然,如果结果是0,我们就不需要增添负号。特别注意的一点是,对于int型整数来说,其范围是[-2147483648, 2147483647],如果将-2147483648转换成正数,会产生数据越界问题,因此我们重载方法, 用long型数据来处理。
对于寻找小数的循环部分,我采取的方法遍历了循环部分两次。第一次遍历记录相应被除数对应的余数,并用StringBuilder类型的decimal变量记录小数部分。一旦出现了重复的被除数,说明我们第二次进入了循环部分,这时候我们开始在HashSet中填充值来记录循环部分对应的被除数,同时用StringBuilder类型的loop变量记录循环部分的被除数对应的商。
最后对于没有循环小数的情况,我们直接将小数部分decimal拼接到整数部分即可。对于有循环小数的情况,我们的拼接分为三部分:整数部分 + 非循环小数部分 + 循环小数部分。
时间复杂度和输入的数据有关。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
return fractionToDecimal((long)numerator, (long)denominator);
}
public String fractionToDecimal(long numerator, long denominator) {
StringBuilder stringBuilder = new StringBuilder();
boolean flag = true;
if(numerator < 0){
flag = !flag;
numerator *= -1;
}
if(denominator < 0){
flag = !flag;
numerator *= -1;
}
if(!flag && 0 != numerator){
stringBuilder.append("-");
}
long integer = numerator / denominator;
stringBuilder.append(integer);
if(0 == numerator % denominator){
return stringBuilder.toString();
}
stringBuilder.append(".");
StringBuilder decimal = new StringBuilder();
numerator -= integer * denominator;
HashMap<Long, Long> hashMap = new HashMap<>(); //键代表的是被除数,值代表的是余数
HashSet<Long> hashSet = new HashSet<>(); //存储重复的被除数
StringBuilder loop = new StringBuilder();
while(0 != numerator){
decimal.append(numerator * 10 / denominator);
hashMap.put(numerator, numerator * 10 % denominator);
numerator = hashMap.get(numerator);
if(hashMap.containsKey(numerator)){
if(hashSet.contains(numerator)){
break;
}else{
loop.append(numerator * 10 / denominator);
hashSet.add(numerator);
}
}
}
if(0 != numerator){
return stringBuilder.toString() + decimal.substring(0, decimal.indexOf(loop.toString())) + "(" + loop + ")";
}else{
return stringBuilder.append(decimal).toString();
}
}
}
LeetCode解题报告: