【2022-08-10每日一题】640. 求解方程

2022-08-10
2分钟阅读时长

2022-08-10每日一题:640. 求解方程

  • 难度:Medium
  • 标签:数学 、 字符串 、 模拟

求解一个给定的方程,将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' 。 ​​​
### 方法一:模拟

根据题意进行模拟即可,设factor表示合并同类项的x的系数,val表示合并数字的值

  • 首先我们对方程左右两边的表达式进行合并同类项
    • 遍历左表达式,默认为正号
      • 若字符是x,加到factor
      • 若字符是+或者-,改变符号位
      • 若字符是数字,则判断后边有没有跟x,有则加到factor上,没有加到val
    • 遍历右表达式,默认为负号,相当于右边的表达式移动到左边(解析同上只是符号相反)
  • factor == 0,判断val是否为0,为0则表示无穷解,不为0表示没有解
  • factor != 0,直接解方程即可,现在的方程变为factor * x = -val,则x = (-val / factor)
func solveEquation(equation string) string {
    factor, val := 0, 0
    i, n, sign := 0, len(equation), 1 // 等式左边默认系数为正
    for i < n {
        if equation[i] == '=' {
            sign = -1 // 等式右边默认系数为负
            i++
            continue
        }

        s := sign
        if equation[i] == '+' { // 去掉前面的符号
            i++
        } else if equation[i] == '-' {
            s = -s
            i++
        }

        num, valid := 0, false
        for i < n && unicode.IsDigit(rune(equation[i])) {
            valid = true
            num = num*10 + int(equation[i]-'0')
            i++
        }

        if i < n && equation[i] == 'x' { // 变量
            if valid {
                s *= num
            }
            factor += s
            i++
        } else { // 数值
            val += s * num
        }
    }

    if factor == 0 {
        if val == 0 {
            return "Infinite solutions"
        }
        return "No solution"
    }
    return "x=" + strconv.Itoa(-val/factor)
}

LeetCode题库地址

参考题解