问题详情
求解一个给定的方程,将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数量,减去右边的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] }