leetcode 640 求解方程
ps:這個是之前在牛客網上做了快手的演算法筆試真題中有一道是解一元一次方程。一開始思路是嘗試將字串轉化成列表然後暴力破解,但是多次嘗試以後報錯,因為方程移項問題導致整個過程非常繁瑣容易出錯。因此在查閱資料之後發現了eval函式的巧妙用法,具體思路可以參閱
說回到這個題,和我之前做的那個解方程的題有很多相似的地方,但是裡面的問題也變多了,總結起來有以下幾點:
對結果的劃分。題目要求輸出結果要被分成三類:一類是『no solution』, 一類是『infinite solutions』 ,和整數解。
對字串的處理。在測試用例中會出現這樣形式的字串「2x=x」。注意這裡省略了「*」會導致eval函式報錯,因此要對字串進行處理。
下面我們就來解決這兩個問題:
對於第乙個問題,其實是乙個數學問題。只要我們能夠理解好eval函式的輸出值是乙個複數,我們就可以對結果進行合理的分類。
r =
eval
(eq_new,
)if r.imag ==
0and r.real !=0:
return
'no solution'
if r.imag ==
0and r.real ==0:
return
'infinite solutions'
else
:return
'x='
+str
(int
(-r.real
)
我們根據複數的實部和虛部進行分類。當實部虛部都等於0的時候,我們有無窮多的解;當實部不等於0但虛部等於0的時候,結果是無解;其他情況可以直接返回結果(注意按題目要求返回的是乙個字串,解應該是乙個整數)
第二個問題雖然還是比較麻煩,但是相對於直接暴力破解要簡單的多。
先上**:
equation = equation.replace(
'=',
'-(')+
')' eq_lis =
list
(equation)
for i in
range
(len
(eq_lis)):
if eq_lis[i]
.isdigit(
)and eq_lis[i+1]
=='x'
: eq_lis[i]
= eq_lis[i]
+'*'
eq_new =
''.join(eq_lis)
首先,把原來的字串處理成沒有等式的形式。然後處理「2x」這樣的非法字元。我採用的方法比較笨,先變成乙個list然後判斷如果是數字跟著x的形式,就直接把數字變成「數字+*」的形式,然後把list再組合起來,這樣就得到了eval裡合法的字串。
完整**:
class
solution
:def
solveequation
(self, equation:
str, var=
'x')
->
str:
equation = equation.replace(
'=',
'-(')+
')' eq_lis =
list
(equation)
for i in
range
(len
(eq_lis)):
if eq_lis[i]
.isdigit(
)and eq_lis[i+1]
=='x'
: eq_lis[i]
= eq_lis[i]
+'*'
eq_new =
''.join(eq_lis)
r =eval
(eq_new,
)if r.imag ==
0and r.real !=0:
return
'no solution'
if r.imag ==
0and r.real ==0:
return
'infinite solutions'
else
:return
'x='
+str
(int
(-r.real
)
結果反饋:
由於用了eval函式,所以整個過程只在處理等式的時候開闢了o(n)的空間,相對於題解裡其他答案使用空間更小。
求解方程 語言 c
時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述 用牛頓迭代法求方程2x 3 4x 2 3xsinx 6 0的根,要求誤差小於10的 6次方。輸入 乙個浮點數,表示起始點。輸出 乙個浮點數,為方程的根。輸入樣例 1.0輸出樣例 2.064076 include include...
MathCAD求解方程組
1 解一元一次方程 root函式 格式 root f x x 例 x 0 定義變數 x 此步不能省 f x 3x 6 root f x x 2 根為2 2 解一元高次方程 格式 polyroots v 其中v是係數矩陣 公升冪排列 例 f x x3 10x 2 r polyroots v 3 解線性...
MATLAB 求解方程(組)
eg.解方程x 2 x 2 0 1.roots p 函式 此 matlab 函式 以列向量的形式返回 p 表示的多項式的根。輸入 p 是乙個包含 n 1 多項式係數的向量,以 xn 係數開頭。0係數表示方程中不存在的中間冪。p 1 1,2 x roots p 2.solve函式 利用solve函式求...