Keshawn_lu's Blog

Leetcode 640. 求解方程

字数统计: 667阅读时长: 3 min
2022/08/10 Share

题目简介:

求解一个给定的方程,将x以字符串 "x=#value" 的形式返回。该方程仅包含 '+''-' 操作,变量 x 和其对应系数。

如果方程没有解,请返回 "No solution" 。如果方程有无限解,则返回 “Infinite solutions”

题目保证,如果方程中只有一个解,则 ‘x’ 的值是一个整数。

示例 1:

1
2
输入: equation = "x+5-3+x=6+x-2"
输出: "x=2"

示例 2:

1
2
输入: equation = "x=x"
输出: "Infinite solutions"

示例 3:

1
2
输入: equation = "2x=x"
输出: "x=0"

提示:

  • 3 <= equation.length <= 1000
  • equation 只有一个 '='
  • equation 方程由整数组成,其绝对值在 [0, 100] 范围内,不含前导零和变量 'x'

思路:

一个字符串模拟题,首先我们修改字符串使得每个整数或每个x前面都有+-,从而来判断正负。

然后我们以符号为分割点,分割出相对应的整数或者x,然后根据等式左右的位置来添加到对应的sumcountx中。

tips:

  • countx == 0 && sum == 0时,有无数个解(x可以取任意值)
  • countx == 0 && sum != 0时,无解(无法成立等式)

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
int NextPos(string& str, int pos){

int pos1 = str.find('+', pos + 1);
int pos2 = str.find('-', pos + 1);

if(pos1 != string::npos && pos2 != string::npos)
return min(pos1, pos2);
else if(pos1 != string::npos)
return pos1;
else if(pos2 != string::npos)
return pos2;
else
return string::npos;
}


class Solution {
public:
string solveEquation(string equation) {

if(equation[0] != '-')
equation = '+' + equation;

int pos = equation.find('=');

if(equation[pos + 1] != '-'){

equation = equation.substr(0, pos + 1) + '+'
+ equation.substr(pos + 1, equation.length() - pos - 1);
}

int countx = 0;
int sum = 0;

pos = equation.find('=');

int i = 0;
while(i < pos){ //等式左边

int nextpos = NextPos(equation, i);

if(nextpos > pos || nextpos == string::npos)
nextpos = pos;

if(equation[nextpos - 1] == 'x'){

string temp = equation.substr(i, nextpos - i - 1);

if(temp == "+")
countx++;
if(temp == "-")
countx--;
else{

if(temp[0] == '+')
countx += atoi(temp.substr(1, temp.length() - 1).c_str());
else
countx -= atoi(temp.substr(1, temp.length() - 1).c_str());
}
}
else{

string temp = equation.substr(i, nextpos - i);

if(temp[0] == '+')
sum -= atoi(temp.substr(1, temp.length() - 1).c_str());
else
sum += atoi(temp.substr(1, temp.length() - 1).c_str());
}

i = nextpos;
}

i = pos + 1;
while(i < equation.length()){ //等式右边

int nextpos = NextPos(equation, i);

if(nextpos == string::npos)
nextpos = equation.length();

if(equation[nextpos - 1] == 'x'){

string temp = equation.substr(i, nextpos - 1 - i);

if(temp == "+")
countx--;
if(temp == "-")
countx++;
else{

if(temp[0] == '+')
countx -= atoi(temp.substr(1, temp.length() - 1).c_str());
else
countx += atoi(temp.substr(1, temp.length() - 1).c_str());
}
}
else{

string temp = equation.substr(i, nextpos - i);

if(temp[0] == '+')
sum += atoi(temp.substr(1, temp.length() - 1).c_str());
else
sum -= atoi(temp.substr(1, temp.length() - 1).c_str());
}

i = nextpos;
}


if(countx == 0 && sum == 0)
return "Infinite solutions";

if(countx == 0 && sum != 0)
return "No solution";

int value = sum / countx;
return "x=" + to_string(value);

}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: