leetcode-求解方程

175 阅读1分钟

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

题目描述

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

思路

按照题目中的限制条件,这个方程是个一元一次方程,最终我们可以化解成ax + b = 0的形式。这个方程在a=0 且 b = 0的情况下有无数个解,在a=0 且 b != 0的情况下无解,其他情况下有一个解x=-b/a,因为题目保证了“如果方程中只有一个解,则 'x' 的值是一个整数”,我们可以用整数直接除。
顺着这个思路,我们的问题就变成了,如何求出a和b。我们可以把字符分成这几种情况:

  • +
  • '-'
  • =
  • nx
  • n

注意,nx这个n==1的时候,是可以省略的,这时候我们要人为拼接1。

Java版本代码

class Solution {
    public String solveEquation(String equation) {
        int x = 0, num = 0;
        boolean positive = true;
        char[] chars = equation.toCharArray();
        int i = 0;
        while (i < chars.length) {
            if (chars[i] == '+') {
                positive = true;
                i++;
            } else if (chars[i] == '-') {
                positive = false;
                i++;
            } else if (chars[i] == '=') {
                x = -x;
                num = -num;
                positive = true;
                i++;
            } else {
                int j = i;
                while (j < chars.length && chars[j] != '+' && chars[j] != '-' && chars[j] != '=') {
                    j++;
                }
                if (chars[j - 1] == 'x') {
                    int temp = (i < j - 1 ? Integer.parseInt(equation.substring(i, j - 1)) : 1);
                    if (!positive) {
                        temp = -temp;
                    }
                    x += temp;
                } else {
                    int temp = Integer.parseInt(equation.substring(i, j));
                    if (!positive) {
                        temp = -temp;
                    }
                    num += temp;
                }
                i = j;
            }
        }
        if (x == 0) {
            if (num == 0) {
                return "Infinite solutions";
            } else {
                return "No solution";
            }
        } else {
            return "x=" + String.valueOf(-num/x);
        }
    }
}