【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)
}