LeetCode-分数到小数

1,104 阅读1分钟

算法记录

LeetCode 题目:

  给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。


说明

一、题目

  如果小数部分为循环小数,则将循环的部分括在括号内。

  如果存在多个答案,只需返回 任意一个 。

  对于所有给定的输入,保证 答案字符串的长度小于 104 。

二、分析

  • 题目纯粹的考察变编码能力,没有涉及什么算法。
  • 需要注意的是 32 位数字的越界问题,因此可以将数据转换为 long 来进行运算。
  • 还有一个就是循环小数点的判断,出现循环的条件肯定是当前的除数已经在之前处理过了,现在有进行处理,那么就进入了循环需要退出,这里就可以使用一个 Map 来进行处理过的数据的保留。
  • 最后只需要在返回的时候在开始出现循环的位置添加上括号即可。
class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        long numerators = numerator, denominators = denominator;
        StringBuilder builder = new StringBuilder(), last = new StringBuilder();
        if(numerators % denominators == 0) {
            return String.valueOf(numerators / denominators);
        }
        if(numerators < 0 ^ denominators < 0) {
            builder.append("-");
        }
        long n = Math.abs(numerators), d = Math.abs(denominators);
        builder.append(n / d);
        builder.append(".");
        n %= d;
        int index = 0;
        Map<Long, Integer> map = new HashMap();
        while(n != 0 && !map.containsKey(n)) {
            System.out.print(d + " ");
            map.put(n, index);
            n *= 10;
            last.append(n / d);
            n %= d;
            index++;
        }
        if(n != 0) {
            int ind = map.get(n);
            last.insert(ind, '(');
            last.append(")");
        }
        builder.append(last.toString());
        return builder.toString();
    }
}

总结

编码能力的考察。