求解一个给定的方程,将x
以字符串"x=#value"的形式返回。该方程仅包含'+',' - '操作,变量 x
和其对应系数。
如果方程没有解,请返回“No solution”。
如果方程有无限解,则返回“Infinite solutions”。
如果方程中只有一个解,要保证返回值 x
是一个整数。
示例 1:
输入: "x+5-3+x=6+x-2"
输出: "x=2"
示例 2:
输入: "x=x"
输出: "Infinite solutions"
示例 3:
输入: "2x=x"
输出: "x=0"
示例 4:
输入: "2x+3x-6x=x+2"
输出: "x=-1"
示例 5:
输入: "x=x+2"
输出: "No solution"
本题有两个注意点:
1)+x或-x时,注意x的系数是1,容易遗忘
2)当x的系数是0时,直接忽略,比如0x
C++
class Solution {
public:
string solveEquation(string equation)
{
int num=equation.length();
int index;
for(int i=0;i<num;i++)
{
if('='==equation[i])
{
index=i;
break;
}
}
if(equation[0]!='+')
{
equation.insert(0,"+");
index++;
num++;
}
if(equation[index+1]!='+')
{
equation.insert(index+1,"+");
num++;
}
vector<int> tmp1;
vector<int> tmp2;
for(int i=0;i<index;i++)
{
if('-'==equation[i] || '+'==equation[i])
{
tmp1.push_back(i);
}
}
for(int i=index+1;i<num;i++)
{
if('-'==equation[i] || '+'==equation[i])
{
tmp2.push_back(i);
}
}
tmp1.push_back(index);
tmp2.push_back(num);
int m=tmp1.size();
int n=tmp2.size();
int left_num=0;
int left_x=0;
int right_num=0;
int right_x=0;
for(int i=1;i<m;i++)
{
if('x'==equation[tmp1[i]-1])
{
string cc=equation.substr(tmp1[i-1]+1,tmp1[i]-tmp1[i-1]-2);
if("0"!=cc)
{
int t=atoi(cc.c_str());
if('+'==equation[tmp1[i-1]])
{
if(0==t)
{
t=1;
}
left_x+=t;
}
else
{
if(0==t)
{
t=1;
}
left_x-=t;
}
}
}
else
{
string cc=equation.substr(tmp1[i-1]+1,tmp1[i]-tmp1[i-1]-1);
int t=atoi(cc.c_str());
if('+'==equation[tmp1[i-1]])
{
left_num+=t;
}
else
{
left_num-=t;
}
}
}
for(int i=1;i<n;i++)
{
if('x'==equation[tmp2[i]-1])
{
string cc=equation.substr(tmp2[i-1]+1,tmp2[i]-tmp2[i-1]-2);
if("0"!=cc)
{
int t=atoi(cc.c_str());
if('+'==equation[tmp2[i-1]])
{
if(0==t)
{
t=1;
}
right_x+=t;
}
else
{
if(0==t)
{
t=1;
}
right_x-=t;
}
}
}
else
{
string cc=equation.substr(tmp2[i-1]+1,tmp2[i]-tmp2[i-1]-1);
int t=atoi(cc.c_str());
if('+'==equation[tmp2[i-1]])
{
right_num+=t;
}
else
{
right_num-=t;
}
}
}
if(left_x==right_x)
{
if(left_num==right_num)
{
return "Infinite solutions";
}
else
{
return "No solution";
}
}
else
{
int tt=(right_num-left_num)/(left_x-right_x);
string res="x=";
return res+to_string(tt);
}
}
};
python
class Solution:
def solveEquation(self, equation):
"""
:type equation: str
:rtype: str
"""
num=len(equation)
for i in range(num):
if '='==equation[i]:
index=i
vec=list(equation)
if '+'!=vec[0]:
vec.insert(0,'+')
index+=1
num+=1
if '+'!=vec[index+1]:
vec.insert(index+1,'+')
num+=1
vec=''.join(vec)
tmp1=[]
tmp2=[]
for i in range(index):
if '+'==vec[i] or '-'==vec[i]:
tmp1.append(i)
for i in range(index+1,num):
if '+'==vec[i] or '-'==vec[i]:
tmp2.append(i)
tmp1.append(index)
tmp2.append(num)
m=len(tmp1)
n=len(tmp2)
left_x=0
left_num=0
right_x=0
right_num=0
for i in range(1,m):
if 'x'==vec[tmp1[i]-1]:
cc=vec[tmp1[i-1]+1:tmp1[i]-1]
if cc!="0":
if cc=="":
t=1
else:
t=int(cc)
if '+'==vec[tmp1[i-1]]:
left_x+=t
else:
left_x-=t
else:
cc=vec[tmp1[i-1]+1:tmp1[i]]
if cc!="":
t=int(cc)
if '+'==vec[tmp1[i-1]]:
left_num+=t
else:
left_num-=t
for i in range(1,n):
if 'x'==vec[tmp2[i]-1]:
cc=vec[tmp2[i-1]+1:tmp2[i]-1]
if cc!="0":
if cc=="":
t=1
else:
t=int(cc)
if '+'==vec[tmp2[i-1]]:
right_x+=t
else:
right_x-=t
else:
cc=vec[tmp2[i-1]+1:tmp2[i]]
if cc!="":
t=int(cc)
if '+'==vec[tmp2[i-1]]:
right_num+=t
else:
right_num-=t
if left_x==right_x:
if left_num==right_num:
return "Infinite solutions"
else:
return "No solution"
else:
res=(right_num-left_num)//(left_x-right_x)
return "x="+str(res)