leetcode刷题记录-640. 求解方程

207 阅读2分钟

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

前言

今天的题目为中等,通过一个比较简单的小技巧,可以转化为简单的数学计算问题。

每日一题

今天的题目是 640. 求解方程,难度为中等

  • 求解一个给定的方程,将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' 。

题解

数学

题目存在一个很巧妙的解法,我们可以先将 '-' 替换为 '+-' 这样就可以通过 '+' 进行字符串分割,从而拿到整个方程式里面的每一个元素,拿到元素之后的解法就会变得轻松很多。

function solveEquation(equation) {
  let [left, right] = equation.split('=')
  let arrLeft = left.replace(/-/g,'+-').split('+')
  let arrRight = right.replace(/-/g,'+-').split('+')
  let xNum = 0;
  console.log(arrLeft);
  console.log(arrRight);
  return 
};

solveEquation("2x+5-3+x=6+x-2")

// [ '2x', '5', '-3', 'x' ]
// [ '6', 'x', '-2' ]

拿到数组里面的元素并且区别出左右两边之后,我们要做的就是移项,将x和正常的数字分别挪到一边,之后就是统计数字加起来的总和以及x的个数,然后就是简单的除法。

对于无解以及无限解的情况,都是在x个数为0的时候,当x个数为0,数字也为0,那就是有无限解,数字不为0,那就是无解。

function solveEquation(equation: string): string {
  let [leftStr, rightStr] = equation.split('=')
  let arrLeft = leftStr.replace(/-/g, '+-').split('+')
  let arrRight = rightStr.replace(/-/g, '+-').split('+')
  let left = 0;
  let right = 0;
  for (let s of arrLeft) {
    if (s === "x") {
      left += 1;
    } else if (s === "-x") {
      left += -1;
    } else if (s.indexOf("x") != -1) {
      left += parseInt(s.substring(0, s.length - 1));
    } else if (s !== "") {
      right -= parseInt(s);
    }
  }
  for (let s of arrRight) {
    if (s === "x") {
      left -= 1;
    } else if (s === "-x") {
      left -= -1;
    } else if (s.indexOf("x") != -1) {
      left -= parseInt(s.substring(0, s.length - 1));
    } else if (s !== "") {
      right += parseInt(s);
    }
  }
  if (left == 0) {
    if (right == 0) {
      return "Infinite solutions";
    } else {
      return "No solution";
    }
  } else {
    return "x=" + right / left;
  }
};

image.png