求解一个给定的方程,将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’ 。
来源:力扣(LeetCode)
这是一个可以直接模拟的题目,但是题本身比较复杂需要注意处理给定的字符串,当然也可以直接用python自带的包来解决问题。在这一题中可以模拟人正常解方程的步骤,先将带x的元素移到一边,然后再将纯数字移到另一边,在移动的过程中需要注意正负号以及各类元素的类型问题,先将字符串同意处理成可以直接利用int转化的式子;接着将不同类型的元素分别相加;最后再约分即可获得答案。
class Solution:
def solveEquation(self, equation: str) -> str:
left,right=equation.split('=') #处理字符串头部
if left.startswith('-'):
left='0'+left
if right.startswith('-'):
right='0'+right
lo,ro=re.findall(r'\+|\-',left),re.findall(r'\+|\-',right) #分离操作符
leftE,rightE=re.split(r'\+|\-',left),re.split(r'\+|\-',right) #分离操作数
leftE[0]='+'+leftE[0] #统一格式
if leftE[0]=='+x' or leftE[0]=='-x':
leftE[0]=leftE[0][0]+'1'+'x'
rightE[0]='+'+rightE[0]
if rightE[0]=='+x' or rightE[0]=='-x':
rightE[0]=rightE[0][0]+'1'+'x'
for i in range(len(lo)): #让操作数带上自己的操作符
leftE[i+1]=lo[i]+leftE[i+1]
if leftE[i+1]=='+x' or leftE[i+1]=='-x':
leftE[i+1]=leftE[i+1][0]+'1'+'x'
for i in range(len(ro)):
rightE[i+1]=ro[i]+rightE[i+1]
if rightE[i+1]=='+x' or rightE[i+1]=='-x':
rightE[i+1]=rightE[i+1][0]+'1'+'x'
lx,ln,rx,rn=0,0,0,0 #分别为左边x的系数和,数字和;右边x的系数和,数字和
for i in leftE: #计算系数
if i.endswith('x'):
lx+=int(i[:-1])
else:
ln+=int(i)
for i in rightE:
if i.endswith('x'):
rx+=int(i[:-1])
else:
rn+=int(i)
if lx==rx and ln!=rn:
return "No solution"
if lx==rx:
return "Infinite solutions"
if lx!=rx and ln==rn:
return 'x=0'
return 'x='+str((rn-ln)//(lx-rx))