携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
求解一个给定的方程,将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"
解析
我们将等式右边的项都移到等式左边,那么等式右边的项的默认系数为 。我们依次解析方程的项,并将同类项进行合并,使用 表示变量的系数, 表示常量值。
初始时默认系数 ,当我们解析到等号时,说明解析到等式右边的项,令 。使用变量 表示项的符号,初始时 ,如果我们解析到 ,那么相应的更改 。使用 记录数字, 表示 是否有效(变量 前面可能没有数字),如果我们解析到的项是变量项,那么相应的更改 ;如果我们解析到的项是常量项,那么相应的更改 。
如果 成立,说明变量 对方程无影响,然后判断 是否成立,成立则说明方程有无数解,返回 。其他情况直接返回对应的整数解 。
var solveEquation = function(equation) {
let factor = 0, val = 0;
let index = 0, n = equation.length, sign1 = 1; // 等式左边默认系数为正
while (index < n) {
if (equation[index] === '=') {
sign1 = -1; // 等式右边默认系数为负
index++;
continue;
}
let sign2 = sign1, number = 0;
let valid = false; // 记录 number 是否有效
if (equation[index] === '-' || equation[index] === '+') { // 去掉前面的符号
sign2 = (equation[index] === '-') ? -sign1 : sign1;
index++;
}
while (index < n && isDigit(equation[index])) {
number = number * 10 + (equation[index].charCodeAt() - '0'.charCodeAt());
index++;
valid = true;
}
if (index < n && equation[index] === 'x') { // 变量
factor += valid ? sign2 * number : sign2;
index++;
} else { // 数值
val += sign2 * number;
}
}
if (factor === 0) {
return val === 0 ? "Infinite solutions" : "No solution";
}
return "x=" + (-val / factor);
};
const isDigit = (ch) => {
return parseFloat(ch).toString() === "NaN" ? false : true;
}