携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
题目描述
求解一个给定的方程,将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'。
题目元素
给定一个字符串,字符串中包含数字[0,100],+-=号,还有变量x,就是给定一元一次方程,求解x。
解题思路
给定方程解方程解,需要先确定字符串中出现的字符的含义,首先x是变量,函数系数和常量范围是[0,100],在处理数字时,可以采用*10的方式获得正确的数字。可以先将等式右边的式子全部放到等式左边,此时记得变号。 然后对函数和常量进行合并,合并完成之后将函数系数和常数带符号相除即得到解。这里一定要注意符号问题,即在运算过程中要始终保持符号同步。
代码实现
/**
* @param equation
* @return
*/
public static String solveEquation(String equation) {
int length = equation.length();
// 当前遍历的下标
int index = 0;
// 函数系数
int factor = 0;
// 常数
int val = 0;
// 是否需要变号,true=需要变号,false=不需要
boolean revertFlag = false;
// 从最左边开始遍历
while (index < length) {
// 每一项前面的符号,true=正号,默认值为是否需要变号的反
boolean addFlag = !revertFlag;
// 如果当前符号为=,代表接下来的式子需要变号处理
if (equation.charAt(index) == '=') {
revertFlag = true;
index++;
continue;
}
if (equation.charAt(index) == '+' || equation.charAt(index) == '-') {
// 如果是正负号,直接取反
addFlag = revertFlag ? equation.charAt(index) == '-' : equation.charAt(index) == '+';
index ++;
}
// 遇到正负号后继续往后,接下来就是数字
int num = 0;
// 这里也有可能函数前面没有系数,所以要用一个标识符来确定x前面有没有系数,没有的话默认是1
boolean defaultFlag = true;
while (index < length && Character.isDigit(equation.charAt(index))) {
// 一直循环到数字结尾 注意这里需要减去0,才能获得正常的十进制数字
num = num*10+(equation.charAt(index)-'0');
index ++;
defaultFlag = false;
}
// 接下来判断是函数系数还是常数
if (index < length && equation.charAt(index) == 'x') {
// 函数系数
if (defaultFlag) {
num = 1;
}
factor += addFlag ? num : -num;
index ++;
}else {
// 常数
val += addFlag ? num : -num;
}
}
// 如果函数系数为0
if (factor == 0) {
if (val == 0) {
return "Infinite solutions";
}else {
return "No solution";
}
}
// 返回解
return "x="+-val/factor;
}