力扣每日一题0810-640. 求解方程

101 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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"

解析

我们将等式右边的项都移到等式左边,那么等式右边的项的默认系数为 1−1。我们依次解析方程的项,并将同类项进行合并,使用 factor\textit{factor} 表示变量的系数,val\textit{val} 表示常量值。

初始时默认系数 sign1=1\textit{sign}_1 = 1,当我们解析到等号时,说明解析到等式右边的项,令 sign1=1\textit{sign}_1 = -1。使用变量 sign2\textit{sign}_2 表示项的符号,初始时 sign2=sign1\textit{sign}_2 = \textit{sign}_1,如果我们解析到 +’或-’\text{+'} 或 \text{-'},那么相应的更改 sign2\textit{sign}_2。使用 number\textit{number} 记录数字,valid\textit{valid} 表示 number\textit{number} 是否有效(变量 xx 前面可能没有数字),如果我们解析到的项是变量项,那么相应的更改 factor\textit{factor};如果我们解析到的项是常量项,那么相应的更改 val\textit{val}

如果 factor=0\textit{factor} = 0 成立,说明变量 xx 对方程无影响,然后判断 val=0\textit{val} = 0 是否成立,成立则说明方程有无数解,返回 "Infinite solutions",否则返回"No solution""\text{Infinite solutions"},否则返回 "\text{No solution"}。其他情况直接返回对应的整数解 x=valfactorx = \dfrac{-\textit{val}}{\textit{factor}}

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;
}