LeetCode探索(117):640-求解方程

109 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情 >>

题目

求解一个给定的方程,将x以字符串 "x=#value" 的形式返回。该方程仅包含 '+''-' 操作,变量 x 和其对应系数。

如果方程没有解,请返回 "No solution" 。如果方程有无限解,则返回 “Infinite solutions”

题目保证,如果方程中只有一个解,则 'x' 的值是一个整数。

示例 1:

输入: equation = "x+5-3+x=6+x-2"
输出: "x=2"

示例 2:

输入: equation = "x=x"
输出: "Infinite solutions"

示例 3:

输入: equation = "2x=x"
输出: "x=0"

提示:

  • 3 <= equation.length <= 1000
  • equation 只有一个 '='.
  • equation 方程由整数组成,其绝对值在 [0, 100] 范围内,不含前导零和变量 'x'

思考

本题难度中等。

首先是读懂题意。我们需要求解一个给定的方程,该方程仅包含 '+''-' 操作,变量 x 和其对应系数。最终我们将x以字符串 "x=#value" 的形式返回。

定义三个变量:x: 变量x的系数, num: 数值部分, sign: 符号。我们遍历字符串str,对于每个字符,判断是哪种字符,如果是正号,则 sign 赋值为 1;如果是负号,则 sign 赋值为 -1;如果是等号,则对 x 和 num 取反,并将 sign 赋值为 1,继续累加求和。如果字符是数字,则继续遍历,直至字符非数字为止。之后,对 x 和 num 累加求和。遍历字符串结束后,计算结果即可,判断 x 和 num 是否为 0,并返回对应的结果。

解答

方法一:模拟

/**
 * @param {string} equation
 * @return {string}
 */
var solveEquation = function(str) {
  // x: 变量x的系数, num: 数值部分, sign: 符号
  let x = 0, num = 0, n = str.length
  for (let i = 0, sign = 1; i < n; ) {
    if (str[i] === '+') {
      sign = 1; i++
    } else if (str[i] === '-') {
      sign = -1; i++
    } else if (str[i] === '=') { // x和num改变符号
      x *= -1; num *= -1; sign = 1; i++
    } else {
      let j = i
      while (j < n && str[j] !== '+' && str[j] !== '-' && str[j] !== '=') {
        j++
      }
      if (str[j - 1] === 'x') {
        x += (i < j - 1 ? parseInt(str.substring(i, j - 1)) : 1) * sign
      } else {
        num += parseInt(str.substring(i, j)) * sign
      }
      i = j
    }
  }
  if (x === 0) {
    return num === 0 ? "Infinite solutions" : "No solution"
  } else {
    return "x=" + (num / -x)
  }
}

复杂度分析:

  • 时间复杂度:O(n),其中 n 是字符串 equation 的长度。
  • 空间复杂度:O(1)。

参考