字符串中数字子串求和问题

输入:ab34c57ddo

输出:91

输入:-1ab--2c78

输出:79

说明:奇数个‘-’表示负号,偶数个‘-’表示正号

下面这个思路又麻烦又复杂,还只能实现正号的操作,愚蠢至极,记录一下岂不也快哉~ 

下面这个方法将字符串遍历一次,将找到连续的数字字符串存放到vector<int> sub中,然后再将所有的sub存放到v中,所以最后v存放的是vector,每个vector存放的是连续的数字的字符串,然后遍历一次将数字字符串转换成数字int型,存放到res容器中最后相加即可。

#include<iostream>
#include<string>
#include<vector>
#include<cmath>
using namespace std;

int main() {
	string s;
	while (cin >> s) {
		vector<vector<int>> v;
		vector<int> sub;
		//将东西压入vector中
		for (int i = 0; i < s.length(); ++i) {
			if (s[i] >= '0'&&s[i] <= '9') {
				sub.push_back(s[i]-'0');
			}
			else {
				v.push_back(sub);
				sub.clear();
			}
			if (sub.size()!=0 && i == s.length() - 1) {//如果这个不为空以及i到了尽头
				v.push_back(sub);
				sub.clear();
			}
		}
		vector<int> res;
		for (int i = 0; i < v.size(); ++i) {
			int temp = 0;
			int mi = v[i].size()-1;
			for (int j = 0; j < v[i].size(); ++j) {
				temp += v[i][j] * pow(10,mi);
				mi--;
			}
			res.push_back(temp);
		}
		int sum = 0;
		for (int i = 0; i < res.size(); i++) {
			sum += res[i];
		}
		cout << sum << endl;
	}
}

 

后来呀,上面的代码简直就是弃简求繁的做法,同时还发现出现复数我这个代码就不能正常工作了,他会将负号‘-’当作一个0-9之外的字符,自然不会存放起来,结果如下:

 

在网上学习之后参考这个连接学习了不少基础知识,直接使用字符串相关的知识就可以实现

一、stoi()

包含着string头文件中,可以直接将一个”98“的字符串变成int类型的98.

回忆字符转换成数字直接c-‘0’即可

 二、字符串相加

string s1 = "";

string s2 = "ab"

s1 = s1+s2;// "ab"

这个虽然看起来简单,但是我每次遇到字符串这个事情都没有用[捂脸]

三、字符串中数字字串求和 

基本思路:学会字符串的基本操作比如加法操作,将会解决很多其他方法比如上面那个愚蠢的方法。

循环遍历字符串,首先统计‘-’号出现的次数,用cmath中pow实现奇偶为问题,用字符串加法和stoi解决数字字符串变成int的问题

#include<iostream>
#include<string>
#include<map>
#include<cmath>
using namespace std;

int main() {
	string s;
	while (cin >> s) {
		int sign = 0;//记录'-'的次数
		string str = "";
		int sum = 0;
		for (int i = 0; i < s.length(); ++i) {
			//掌握一个思路是考虑字符串出现循环的时候使用while建立内循环即可
			while (s[i] == '-') {
				sign++;
				++i;//i++看是否连续存在'-'
			}
			int flag = 0;
			//掌握一个思路是考虑字符串出现循环的时候使用while建立内循环即可
			//但是注意建立了内循环之后i已经自增,这次循环之后在大循环还要自增一次的,这样会跳过一个数的,但是不知道这个是不是'-'号,所以设置标志位
			while(s[i] >= '0'&&s[i] <= '9') {
				str += s[i];//增加数字字串到str中
				++i;//在这里i自增,如果符合条件的字符自然会继续添加到str中去
				flag = 1;
			}
			if (flag == 1)
				--i;
			//跳出这个循环之后肯定已经完成将连续的数字串都添加到str了
			if (str != "") {
				sum += pow(-1, sign)*stoi(str);
			}
			str = "";
			sign = 0;
		}
		cout << sum << endl;
	}
}

 测试结果:

最后总结一点:在字符串中判断是否循环出现连续类型的字符比如数字,可以使用while做内循环,但是应该注意while()内循环中i++了一次,考虑是否需要否则在大循环中还会i++一次跳过一个数,比如上面代码如果去掉后面flag的判断实现--i将会跳过”ab3-1“中的‘-’号,最后输出的结果为4,但是实际我们想要的是2.

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main() {
	string s;
	while (cin >> s) {
		int sum = 0;
		for (int i = 0; i < s.length(); ++i) {
			string temp_str = "";
			int sign = 0;
			while (s[i] == '-') {
				sign++;
				++i;
			}
			while (s[i] >= '0'&&s[i] <= '9') {
				temp_str += s[i];
				++i;
			}
			
			if (temp_str != "") {
				sum += pow(-1, sign)*stoi(temp_str);
				--i;//为了兼容字母的下一个刚好是'-'
			}
		}
		cout << sum << endl;
	}
}

参考连接:https://blog.csdn.net/liugg2016/article/details/82192763 

猜你喜欢

转载自blog.csdn.net/Li_haiyu/article/details/88830491