leetcode刷题日记-【640. 求解方程】

127 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

题目描述

求解一个给定的方程,将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'。

题目元素

给定一个字符串,字符串中包含数字[0,100],+-=号,还有变量x,就是给定一元一次方程,求解x。

解题思路

给定方程解方程解,需要先确定字符串中出现的字符的含义,首先x是变量,函数系数和常量范围是[0,100],在处理数字时,可以采用*10的方式获得正确的数字。可以先将等式右边的式子全部放到等式左边,此时记得变号。 然后对函数和常量进行合并,合并完成之后将函数系数和常数带符号相除即得到解。这里一定要注意符号问题,即在运算过程中要始终保持符号同步。

代码实现

/**
 * @param equation
 * @return
 */
public static String solveEquation(String equation) {
    int length = equation.length();
    // 当前遍历的下标
    int index = 0;
    // 函数系数
    int factor = 0;
    // 常数
    int val = 0;
    // 是否需要变号,true=需要变号,false=不需要
    boolean revertFlag = false;
    // 从最左边开始遍历
    while (index < length) {
        // 每一项前面的符号,true=正号,默认值为是否需要变号的反
        boolean addFlag = !revertFlag;
        // 如果当前符号为=,代表接下来的式子需要变号处理
        if (equation.charAt(index) == '=') {
            revertFlag = true;
            index++;
            continue;
        }
        if (equation.charAt(index) == '+' || equation.charAt(index) == '-') {
            // 如果是正负号,直接取反
            addFlag = revertFlag ? equation.charAt(index) == '-' : equation.charAt(index) == '+';
            index ++;
        }
        // 遇到正负号后继续往后,接下来就是数字
        int num = 0;
        // 这里也有可能函数前面没有系数,所以要用一个标识符来确定x前面有没有系数,没有的话默认是1
        boolean defaultFlag = true;
        while (index < length && Character.isDigit(equation.charAt(index))) {
            // 一直循环到数字结尾 注意这里需要减去0,才能获得正常的十进制数字
            num = num*10+(equation.charAt(index)-'0');
            index ++;
            defaultFlag = false;
        }
        // 接下来判断是函数系数还是常数
        if (index < length && equation.charAt(index) == 'x') {
            // 函数系数
            if (defaultFlag) {
                num = 1;
            }
            factor += addFlag ? num : -num;
            index ++;
        }else {
            // 常数
            val += addFlag ? num : -num;
        }
    }
    // 如果函数系数为0
    if (factor == 0) {
        if (val == 0) {
            return "Infinite solutions";
        }else {
            return "No solution";
        }
    }
    // 返回解
    return "x="+-val/factor;
}