题目:给出形如“3x-2=x”的一个方程字符串,求给出形如“x=1”的该方程的解。【Leetcode 640】
思路:将字符串依次读入,用两个指针进行字符串截取,分别存入两个变量中:x的系数、常数项。
1.两个指针一停一动,其中一个用来依次读入字符,另一个则标记之前的特征位置。(特征位置是说"+ - ="这些符号的位置)从而每次都能从两个指针之间读取数据,读完后标记指针后移到当前的特征位置,移动指针则继续向后探索。
2.字符截取用并列的 if, else if 等语句,或者并列的 if {continue} 语句。
3.变量初始设为0,然后依次读取叠加,注意需要引进一个符号变量signal=1, 使它在 '='之后反转为-1.
很多算法问题都能用到两指针的思想。
代码如下:
#include<iostream>
#include<string>
using namespace std;
int main() {
string str;
while (cin >> str) {
int i=0, j=0; //两个指针:i跑动,j标记
int a=0, b=0; //两个参数变量: ax+b=0
int signal = 1;
for (i = 0; i < str.size(); i++) {
//"=" 前面必为常数项或者空
if (str[i] == '=') {
if (i > j) //“stoi(空子串)”会导致错误,所以需要判断i>j
b += signal*stoi(str.substr(j, i - j));//substr(首索引,长度)
signal = -1;
j = i + 1; //将标记指针置为等号后面的第一个字符
continue;
}
//"[+-]" 前面必为常数项或者空
if (str[i] == '+' || str[i] == '-') {
if (i > j)
b += signal*stoi(str.substr(j, i - j));
j = i; //将标记指针置为+/-号处,这样所有的数据处理都简易为叠加
continue;
}
//"x" 前面必为x系数项或者仅"+/-/="号
if (str[i] == 'x') {
if (i == j || str[i - 1] == '+')
a += signal;
else if (str[i - 1] == '-')
a -= signal;
else
a += signal*stoi(str.substr(j, i - j));
j = i + 1;
continue;
}
}
//注意若是常数项,则i不会停下来,导致最后的常数会被漏掉
//因为最后一个字符要么是数字,要么是x. 分析这两种情况即可
if (j < str.size())
b += signal*stoi(str.substr(j));
//输出结果
if (a == 0 && b == 0)
cout << "无穷解" << endl;
else if (a == 0 && b)
cout << "无解" << endl;
else {
int ans = -b / a;
cout << "x="+to_string(ans) << endl;
}
}
}