携手创作,共同成长!这是我参与「掘金日新计划 · 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 <= 1000equation只有一个'='.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)。