LeedCode刷题:640.求解方程
解题思路:
1.先将表达式里的减号“-”用replaceAll全换成“+-”,可以简化减号和加号运算
2.将方程式以=分为左右两个式子后,再将两个式子以“+”号分割成两个字符串数组leftArray和rightArray来进行cal计算
3.将每个式子的x的系数和常数d的系数以cal方法计算出来,
读取字符串part[i],处理含x和不含x的项,通过iscontainsX方法判断含x,方法最终返回一个{x,d}的数组
4.然后在主方法体里进行细节计算,讨论无解和无限解,以及正常解的情况
1 class Solution { 2 public String solveEquation(String equation) { 3 equation=equation.replaceAll("-","+-");//将-号化为+-号 4 String left=equation.substring(0,equation.indexOf("="));//分割成两个子串,左表达式 5 String right=equation.substring(equation.indexOf("=")+1,equation.length());//右表达式 6 String []leftArray=left.split("\\+");//以+分割字符串存入字符串数组 7 String []rightArray=right.split("\\+"); 8 int l[]=cal( leftArray);//计算,返回x和常数d的系数 9 int r[]=cal( rightArray); 10 if(l[0]==r[0]&&l[1]==r[1]){//x系数和d的系数均为0,则无限解 11 return "Infinite solutions"; 12 }else if(l[0]==r[0]&&(l[1]-r[1])!=0){//x系数为0,常数系数不为0,无解 13 return "No solution"; 14 }else{ 15 if(l[0]>r[0]){//左表达式x系数大于右表达式x系数 16 return "x="+(r[1]-l[1])/(l[0]-r[0]);//则右常数-左常数/x系数差 17 }else{ 18 return "x="+(l[1]-r[1])/(r[0]-l[0]);//则左常数-右常数/x系数差 19 } 20 } 21 } 22 public int []cal(String []part){ 23 int x=0; 24 int d=0; 25 for(int i=0;i<part.length;i++){ 26 String a=part[i]; 27 if(a.equals("")){ 28 continue; 29 } 30 if(isContainsX(a)){//处理含x的项 31 if(a.equals("-x")){ 32 x+=-1; 33 }else if(a.equals("x")){ 34 x+=1; 35 }else{ 36 a=a.replace("x","");//遇到如3x,4x,5x这类x的系数不是1或-1的,则将x删掉只剩下系数,再将系数转为int加入x的系数 37 x+=Integer.parseInt(a); 38 } 39 }else{//不含x则为常数 40 d+=Integer.parseInt(a); 41 } 42 } 43 return new int []{x,d}; 44 } 45 public boolean isContainsX(String a){ 46 return a.contains("x"); 47 } 48 }