作者;哇塞大嘴好帅
执行用时:1 ms, 在所有 Java 提交中击败了94.83%的用户
内存消耗:39.2 MB, 在所有 Java 提交中击败了97.85%的用户
我们把方程"x+5-3+x=6+x-2"看成x=5-3-6-x+2=0,然后创建3个变量,一个用于记录x的系数,一个用于记录普通的数字,一个变量用户区别=的左侧和右侧,在创建一个变量用户用来记录当前处理到哪里了。
int corr = 0,sum =0 ,sige = 1,index =0;
当sige为1的时候代表处理的是=号的左面,当sige为-1的时候代表处理的是等号的右边。
接下来遍历字符串equation,不过要处理几种特殊情况,一种是当我们遍历的时候遍历到=,一种是当我们遍历的时候遍历到x,一种是当我们遍历的时候遍历到单纯的+ -号。
for (int i = 0; i < equation.length(); i++) {
char c = equation.charAt(i);
if (c == '='){
.....
} else if (c == 'x') {
.....
} else if (c == '+' || c == '-') {
.....
}
}
当我们遍历到=的时候,要判断是否出现了一种特殊情况就是=的左面是数字,比如案列是"1+1=x",所以我们把1也算入进去
if (c == '='){
//出现了x+5=... 的情况
if (index < i){
sum += Integer.valueOf(equation.substring(index,i));
}
sige = -1;
index = i + 1;
}
接下来如果是遍历到x的时候,如果是单纯的x或者是-x那么把他的系数看为1或者是-1,至于为什么±suge是因为如果在括号左面遇见就代表着如果是x就直接+1,如果是-x久直接-1,如果在括号右边遇见那么如果是x就-1,如果是-x就+1,还有一种正常的情况,就是3x,-3x这种情况,直接将她的系数*sige即刻
else if (c == 'x') {
//如果遇见的只是一个单独的X 但是x可能是正的也可以能是负的
if (index == i || equation.charAt(i-1) == '+'){
corr += sige;
} else if (equation.charAt(i-1) == '-') {
corr -= sige;
}
//出现3x 4x情况
else{
corr += Integer.valueOf(equation.substring(index,i)) * sige;
}
index = i + 1;
}
还有一种情况遍历到了+ -号的时候,就把出现的数字累加起来,关于为什么index ==i 是防止出现 +5-3这种情况 要读取的是-3而不是3.
else if (c == '+' || c == '-') {
if (index < i){
sum += Integer.valueOf(equation.substring(index,i)) * sige;
}
//关于为什么index ==i 是放逐出现 +5-3这种情况 要读取的是-3而不是3
index = i;
}
当我们全部遍历完事后会出现一种特殊情况,这种特殊情况就是我们i已经遍历完了但是我们的index还没有到字符串的最后一位,比如案列
/**
* 会出现一种特殊情况比如6+x-2"
* 当index到倒数第2个的时候 但是i会一直往后走 会结束for循环 所以要把最后一个数字耶计算进入
*/
所以我们要做一下特殊的处理
if (index < equation.length()){
sum += Integer.valueOf(equation.substring(index)) * sige;
}
剩下就是这两种情况的求解,如果x的系数和普通数字的sum都为0那么直接返回IS,如果corr == 0 那么直接返回NS
if (corr == 0 && sum == 0){
return "Infinite solutions";
}
if (corr == 0){
return "No solution";
}
如果都不满足以上条件那么我们求出x的解
return "x="+String.valueOf(-sum/corr);
至于这个sum为什么为-数是因为我们把公式变成了3x+3=0;我们要更改为3x=-3;这种。
class Solution {
public String solveEquation(String equation) {
int corr = 0,sum =0 ,sige = 1,index =0;
for (int i = 0; i < equation.length(); i++) {
char c = equation.charAt(i);
if (c == '='){
//出现了x+5=... 的情况
if (index < i){
sum += Integer.valueOf(equation.substring(index,i));
}
sige = -1;
index = i + 1;
} else if (c == 'x') {
//如果遇见的只是一个单独的X 但是x可能是正的也可以能是负的
if (index == i || equation.charAt(i-1) == '+'){
corr += sige;
} else if (equation.charAt(i-1) == '-') {
corr -= sige;
}
//出现3x 4x情况
else{
corr += Integer.valueOf(equation.substring(index,i)) * sige;
}
index = i + 1;
} else if (c == '+' || c == '-') {
if (index < i){
sum += Integer.valueOf(equation.substring(index,i)) * sige;
}
//关于为什么index ==i 是放逐出现 +5-3这种情况 要读取的是-3而不是3
index = i;
}
}
//System.out.println(index+"and "+equation.length());
/**
* 会出现一种特殊情况比如6+x-2"
* 当index到倒数第2个的时候 但是i会一直往后走 会结束for循环 所以要把最后一个数字耶计算进入
*/
if (index < equation.length()){
sum += Integer.valueOf(equation.substring(index)) * sige;
}
if (corr == 0 && sum == 0){
return "Infinite solutions";
}
if (corr == 0){
return "No solution";
}
return "x="+String.valueOf(-sum/corr);
}
}