leetcode-640-表达式解析-解题思路

这个提其实不太难,第一眼却没做出来,看了题解之后才思路清晰了, 有思路了很容易做出来
所有的表达式,经过计算最总都会变成, n\*x + val = 0 , n val 都是数值,我们要做的就是把 n ,val 计算出来,

  • 考虑等号(“=”)的问题,和做算术题一样,把右边挪到左边, 相当于就是减去左边, 也就是 减一下(-)
    设置一个标记,把之后的值都取个反, 对于代码的话, 不就是 a = -a 么?
  • 符号判断, 加号, 减号 ,等于号 , 加号 不用管 ,减号 取个反, 还有一个考虑点就是 = 这个标记之后的情况, 结合判断
    例如: 如果是 = 右边的, 本来是 - , 现在就变成了 +
  • 解析 x 之前的数字,这个就是一个数字字符串 转数字的算法
    可能是 100x, 5x, 18x 等等这种情况, 其实就是正常解析数字字符串一样, 每次 数值*10 + 当前值 ,直到 不是数字 停止, 保存并累加
  • 正常数值就没啥考虑的了,直接累加即可.

最后根据结果,进行计算, 需要判断表达式是否有效的情况.

如果 n*xn0 的时候,x 对表达式无影响, 这时候,判断 val 即可:

  • 如果val = 00 = 0, 有 无数解,任意值都可以,
  • 如果是 val != 0 ,那么就是无解.

剩下情况就是正常解, 返回 -val / n 即可. 下面是官方的 golang 题解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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-640-表达式解析-解题思路

https://www.md7.top/2023/06/08/力扣640-leetcode-640解题/

作者

Fat Dong

发布于

2023-06-08

更新于

2023-06-08

许可协议