🌈【LeetCode - 分数小数】- JavaScript =>状态模拟+Map

482 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

/GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


166. 分数到小数

题目描述

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

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

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

示例 1:

输入:numerator = 1, denominator = 2
输出:"0.5"

示例 2:

输入:numerator = 4, denominator = 333
输出:"0.(012)"

思路:除法模拟+Map

  1. 模拟除法,是否除尽
  2. 不能整除,整数小数分开处理
  3. 通过一个Map,记录每次余数和序号
  4. 若余数为0,则拼接整数部分+小数部分,返回结果
  5. 遇到哈希表中已有的余数时,在已有余数的索引前插入(末尾插入)即可。
var fractionToDecimal = function(numerator, denominator) {
    let rem = Math.abs(numerator) % Math.abs(denominator);
    let divide = numerator/denominator;
    let sign = true;
    if (divide < 0){
        sign = false;
        divide = -divide;
    }
    let int = Math.floor(divide);
    if (rem == 0) {
        if (sign) return `${int}`;
        return `-${int}`
    };
    let float = [];
    let remMap = new Map();
    let index = 1;
    while (rem != 0) {
        if (!remMap.has(rem)){
            remMap.set(rem, index);
        } else {
            float.splice(remMap.get(rem) - 1, 0, '(')
            float.splice(index, 0 ,')');
            return sign ? int + '.' + float.join('') : '-' + int + '.' + float.join('');
        }
        rem *= 10;
        index++;
        if (rem < denominator){
            float.push(0);
            continue;
        }
        float.push(Math.floor(rem/Math.abs(denominator)));
        rem = rem % Math.abs(denominator)
    }
    return sign ? int + '.' + float.join('') : '-' + int + '.' + float.join('')
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤