LeetCode ---- 166、分数到小数

tech2022-07-09  203

题目链接

思路:

为了计算方便,判断分子分母是否为一正一负,用来标记结果为正或负

接下来,对原始的分子分母进行向上转型为long类型(避免取绝对值时发生溢出),并且取绝对值

对得到的long类型的分子分母开始计算,计算时,需要根据前面判断的正负来添加运算结果的符号,并且还需要判断是否出现了循环小数

出现循环小数时,说明之前已经出现了相同的小数,这里用一个map记录已经出现的小数和他们出现在整个小数部分的位置,便于在后面出现循环小数时,进行添加括号的操作。

public String fractionToDecimal(int numerator, int denominator) { // 特判。分子或分母为0时,直接返回"0" if (numerator == 0 || denominator == 0) { return "0"; } // 默认为正,1代表正,-1代表负 int flag = 1; // 若分子分母一正一负,则符号为负 if ((numerator > 0 && denominator < 0) || (numerator < 0 && denominator > 0)) { flag = -1; } // 先转为long,再取绝对值 long num = Math.abs((long) numerator); long denom = Math.abs((long) denominator); // 整数部分 long big = num / denom; // 余数部分,用于计算小数 long small = num % denom; // 记录结果 StringBuilder result = new StringBuilder(); // 为负,则添加"-" if (flag == -1) { result.append("-"); } // 整数部分添加进结果 result.append(big + ""); // 余数不为0时,才需要进行小数部分的计算 if (small != 0) { // 添加小数点 result.append("."); // 记录小数部分的结果 StringBuilder smallStr = new StringBuilder(); // 记录计算的小数以及它们添加进小数结果字符串的位置 Map<String, Integer> smallIndexs = new HashMap<>(); while (small != 0) { small *= 10; big = small / denom; small = small % denom; // 标识当前整除和余数结果,若后面出现了相同的,则说明出现小数循环 String str = small + "_" + big; // 若出现了之前出现过的小数,则需要对之前相同部分小数添加括号 if (smallIndexs.containsKey(str)) { smallStr.append(")"); smallStr.insert(smallIndexs.get(str), "("); break; } else { // 将当前标识符和当前小数总长度记录下来 // 因为插入时会插入到当前小数字符串的最后位置 smallIndexs.put(str, smallStr.length()); smallStr.append(Math.abs(big)); } } result.append(smallStr); } return result.toString(); }

代码参考:https://leetcode-cn.com/problems/fraction-to-recurring-decimal/comments/173008

最新回复(0)