package LeetCode_HashTable; import java.util.HashMap; /** * 题目: * 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. * 解题思路: * 整数部分很好处理,只要注意正负号的区分就行了,但是如何处理小数部分呢。如果只是简单的除法,那我们每次把余数乘以10, * 再除以被除数就可以得到当前位的小数了,得到新的余数,直到余数为0。难点在于,对于无尽循环小数,我们一直这么做永远也不能让余数变为0。 * 这里我们可以用一个哈希表记录每次的余数,如果余数出现重复的时候,说明就产生循环了。为了能找出小数中循环的部分, * 我们在用哈希表时,还要把每个余数对应的小数位记录下来,这样子我们一旦遇到重复,就知道是从哪里开始循环的。 * 注意: * 如果输入的被除数很大,那么余数乘以10有可能溢出,所以我们用long来保存numerator和denominator。 * */ public class FractionToDecimal_166_1020 { public String FractionToDecimal(int numerator, int denominator) { StringBuilder result = new StringBuilder(); //判断分子是否为0 if (numerator == 0) { return "0"; } //判断正负 //result.append(((numerator > 0) ^ (denominator > 0)) ? "-" : ""); if ((numerator > 0) ^ (denominator > 0)) { result.append("-"); } else result.append(""); Long num = Math.abs((long) numerator); Long den = Math.abs((long) denominator); //整数部分 result.append(num / den); num = num % den; if (num == 0) { return result.toString(); } //确定小数部分 result.append("."); HashMap<Long, Integer> map = new HashMap<>(); map.put(num, result.length()); while (num != 0) { num *= 10; result.append(num / den); num %= den; if (map.containsKey(num)) { int index = map.get(num); result.insert(index, "("); result.append(")"); break; } else map.put(num, result.length()); } return result.toString(); } public static void main(String[] args) { int numerator = -1; int denominator = -2147483648; FractionToDecimal_166_1020 test = new FractionToDecimal_166_1020(); String result = test.FractionToDecimal(numerator, denominator); System.out.println(result); } }
leetcode:(166) Fraction To Recurring Decimal(java)
最新推荐文章于 2022-03-24 12:07:20 发布