【八月】每日一题 - 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' 。  ​​​

链接:leetcode.cn/problems/so…

解题思路

很经典的一个方程题,核心思路都是统计x的数量以及剩余数字的合。 试想一下,我们讲所有x移到左边,数字和移动到右边,方程求解就是一个除法。

那就统计=左边的x数量,减去右边的x数量。然后将右边的算数合减去左边的算数合即可。

  • 方程就被我们化解成这样x + 2 = 2x - 1 ---> -x = -3
  • 需要注意一点如60x + ..,我们需要缓存数字,遇到符号+ - x之中任意一个就将数字“用掉”,并且重制,直接使用字符串岂可。('6' + '0' = '60'

AC代码

var solveEquation = function(equation) {
    let equaIndex = equation.indexOf('=')
    let [leftNum,leftXNum] = getNum(0,equaIndex - 1,equation)
    let [rightNum,rightXNum] = getNum(equaIndex + 1,equation.length - 1,equation)
    let num = leftNum - rightNum
    let xNum = rightXNum - leftXNum
    if(xNum === 0 && num !== 0){
        return 'No solution'
    }
    return xNum === 0 ? 'Infinite solutions' : ('x=' + num / xNum)
};

function getNum(start,end,str){
    let sum = 0, xNum = 0
    let temp = ''
    for(let i = start; i <= end; i++){
        if(str[i] === 'x'){
            if(temp !=='' && temp !== '+' && temp !== '-'){
                xNum += Number(temp)
            }else{
                xNum += Number(temp + 1)
            }
            temp = ''
        }else if(str[i] === '+' || str[i] === '-'){
            sum += Number(temp)
            temp = str[i]
        }else{
            temp += str[i]
        }
    }
    sum += Number(temp) // 需要注意的是如果最后一个为数字的话,会被我们缓存,而没有进行计算
    return [sum,xNum]
}
复制代码

猜你喜欢

转载自juejin.im/post/7130081385351479309