求解一个给定的方程,将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 只有一个 '='.
方程由绝对值在 [0, 100] 范围内且无任何前导零的整数和变量 'x' 组成。
func solveEquation(equation string) string {
//核心:
//1.初始时变量和常数为 0 * X + 0, 默认系数为+
//2.等号右边系数默认为-(相当于把等号右边的东西都移到左边 a * x + b = 0)
//3.设置变量存储num(变量系数或常量值), 设置符号变量存储符号值
//4.根据x的系数factor和变量值val来确定解
factor, val := 0, 0 //factor 表示变量的系数,val 表示常量值, 初始化时为 0 * X + 0
i, n, sign := 0, len(equation), 1 //等式最左边默认系数为正
for i < n{//遍历整个equation字符串
//指针来到等号右边,提前加“-”号
if equation[i] == '='{//接下来进入方程右边
sign = -1//等式右边默认系数为负
i++//指针往右走
continue//结束本次循环
}
//确定变量或常数前面的符号
s := sign//在等式左边时为正,右边为负,最左边没有符号则为+
if equation[i] == '+'{//去除前面的符号
i++
}else if equation[i] == '-'{
s = -s
i++
}
//确定变量的系数或常量值
num, valid := 0, false //number 记录数字,valid 表示 number 是否有效(变量 x 前面可能没有数字)
for i < n && unicode.IsDigit(rune(equation[i])){//指针所指位置为数字,当指针越界或者所指对象不为数字时结束循环
valid = true//设为有效
num = num * 10 + int(equation[i] - '0')
i++
}
if i < n && equation[i] == 'x'{//解析到的项是变量项,相应的更改factor;如果解析到的项是常量项,那么相应的更改val
if valid{
s *= num//s表示正负,num表示系数
}
factor += s
i++
}else{//解析的项是常量项
val += s * num
}
}
if factor == 0{//factor表示变量x的系数
//变量 x 对方程无影响,然后判断 val=0 是否成立,成立则说明方程有无数解,返回 “Infinite solutions",否则返回 {``No solution"}“No solution"。其他情况直接返回对应的整数解 x = -val \ factor
if val == 0{// 0 * X + 0 = -0
return "Infinite solutions"
}
return "No solution"//0 * X + 1 = -0
}
return "x=" + strconv.Itoa(-val/factor)
}