返回

LeetCode-分数小数-JavaScript-状态模拟+Map

前端

LeetCode - 分数小数 - JavaScript - 状态模拟+Map

前言

在 LeetCode 上,分数小数问题是一个常见的算法问题,它要求将一个分数表示为小数。例如,分数 1/3 可以表示为小数 0.3333333...。本文将介绍如何使用 JavaScript 来解决这个问题,详细讲解状态模拟和 Map 的使用,并提供代码示例和详细解释。无论你是 LeetCode 爱好者还是 JavaScript 开发人员,都能从本文中学到新的知识和技巧。

问题

给定两个整数 numerator 和 denominator,表示分数 numerator/denominator,请将该分数表示为小数。

解决方案

为了解决这个问题,我们将使用 JavaScript 的状态模拟和 Map 数据结构。状态模拟是一种常见的算法技巧,它可以帮助我们跟踪算法执行过程中的状态,并根据状态做出不同的操作。而 Map 数据结构则可以帮助我们存储和检索数据,在分数小数问题中,我们可以使用 Map 来存储已经计算过的余数和商。

代码实现

/**
 * 将分数表示为小数
 *
 * @param {number} numerator 分子
 * @param {number} denominator 分母
 * @returns {string} 小数表示
 */
const fractionToDecimal = (numerator, denominator) => {
  if (numerator === 0) {
    return "0";
  }

  // 检查是否为负数
  const negative = numerator * denominator < 0;

  // 取绝对值
  numerator = Math.abs(numerator);
  denominator = Math.abs(denominator);

  // 计算整数部分
  const integerPart = Math.floor(numerator / denominator);

  // 计算小数部分
  const decimalPart = [];
  const map = new Map(); // 存储已经计算过的余数和商

  // 循环计算小数部分
  while (numerator % denominator !== 0) {
    // 计算余数
    const remainder = numerator % denominator;

    // 检查余数是否在 map 中
    if (map.has(remainder)) {
      // 如果余数在 map 中,说明出现了循环小数
      const index = map.get(remainder); // 获取循环小数开始的位置
      return (
        (negative ? "-" : "") +
        integerPart +
        "." +
        decimalPart.slice(0, index).join("") +
        "(" +
        decimalPart.slice(index).join("") +
        ")"
      );
    }

    // 将余数和商添加到 map 中
    map.set(remainder, decimalPart.length);

    // 计算商
    const quotient = Math.floor(numerator / denominator);

    // 将商添加到小数部分
    decimalPart.push(quotient);

    // 更新分子
    numerator = remainder * 10;
  }

  // 返回小数部分
  return (
    (negative ? "-" : "") +
    integerPart +
    "." +
    decimalPart.join("")
  );
};

时间复杂度

算法的时间复杂度为 O(n),其中 n 为字符串的长度。

空间复杂度

算法的空间复杂度为 O(n),其中 n 为字符串的长度。

示例

console.log(fractionToDecimal(1, 3)); // "0.3333333..."
console.log(fractionToDecimal(2, 1)); // "2"
console.log(fractionToDecimal(4, 3)); // "1.3333333..."
console.log(fractionToDecimal(1, 5)); // "0.2"

总结

本文介绍了如何使用 JavaScript 来解决 LeetCode 上的分数小数问题,详细讲解了状态模拟和 Map 的使用,并提供了代码示例和详细解释。无论你是 LeetCode 爱好者还是 JavaScript 开发人员,都能从本文中学到新的知识和技巧。