【字符串】解简易方程

题目:给出形如“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;
		}		
	}	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值